HDU 2066 一个人的旅行
2016-07-23 19:37
357 查看
题意:
给你T条路的无向图,有S个起点和D个终点,让你选择一个起点到达某个终点使其路径最小。
思路:
多个起点问题很自然想到建立个超级原点0
把它和所有起点连起来,边长为0。然后跑一变SPFA就可以啦。
给你T条路的无向图,有S个起点和D个终点,让你选择一个起点到达某个终点使其路径最小。
思路:
多个起点问题很自然想到建立个超级原点0
#include<cstdio> #include<cstring> #include<queue> #include<algorithm> #define INF 0x3f3f3f3f #define MAXN 1005 #define MAXM 1000005 using namespace std; struct Node { int u,v,w; int next; }edge[MAXM]; int tol; int head[MAXN]; int dist[MAXN]; int vis[MAXN]; int n,m,c,Max; void init() { tol=0; memset(head,-1,sizeof(head)); } void addedge(int u,int v,int w) { edge[tol].u=u; edge[tol].v=v; edge[tol].w=w; edge[tol].next=head[u]; head[u]=tol; tol++; } void SPFA(int v0) { queue<int> q; for(int i=0;i<=Max;i++) { dist[i]=INF; vis[i]=0; } dist[v0]=0; vis[v0]=1; q.push(v0); while(!q.empty()) { int u=q.front(); q.pop(); vis[u]=0; for(int i=head[u];i!=-1;i=edge[i].next) { int v=edge[i].v; if(dist[v]>dist[u]+edge[i].w) { dist[v]=dist[u]+edge[i].w; if(!vis[v]) { q.push(v); vis[v]=1; } } } } } int main() { while(~scanf("%d%d%d",&n,&m,&c)){ init(); int u,v,w; for(int i=1;i<=n;i++){ scanf("%d%d%d",&u,&v,&w); addedge(u,v,w); addedge(v,u,w); Max=max(Max,max(u,v)); } for(int i=1;i<=m;i++){ scanf("%d",&v); addedge(0,v,0); } SPFA(0); int ans=INF; for(int i=1;i<=c;i++){ scanf("%d",&v); ans=min(ans,dist[v]); } printf("%d\n",ans); } return 0; }
把它和所有起点连起来,边长为0。然后跑一变SPFA就可以啦。
相关文章推荐
- 发送短信验证码计时
- CSS伪类和伪元素的本质区别
- android天气预报(二)
- MFC文档读取TXT文件中的数据并传输到对话框中
- javascript基础
- HDU5363:Key Set
- 如何解决兼容性问题
- 【技巧】简单理解快速幂(求模)
- 【codefors】贪心
- java-基础-集合hashset
- UnicodeDecodeError: 'ascii' codec can't decode byte 0xc1 in position 7: ordinal not in range(128)
- python核心编程学习笔记-2016-07-23-03-反单引号
- Visual Studio Code + live-server编辑和浏览HTML网页
- AQS源码分析
- 二进制文件读和写(fread,fwrite)
- 数据同步算法(rsync和RDC)
- malloc,ralloc,calloc的区别
- Decide which type to use
- POJ 2524 Ubiquitous Religions
- bootstrap之常见组件应用1