首页 > 代码库 > hdu 2680 Choose the best route
hdu 2680 Choose the best route
http://acm.hdu.edu.cn/showproblem.php?pid=2680
这道题是有向图。把全部可以出发的点进队列spfa就可以。
1 #include <cstdio> 2 #include <vector> 3 #include <queue> 4 #include <cstring> 5 #include <algorithm> 6 #define maxn 1001 7 using namespace std; 8 const int inf=1<<28; 9 10 int n,m,s; 11 int p,q,t; 12 int g[maxn][maxn]; 13 int dis[maxn]; 14 int c[maxn]; 15 int w; 16 bool vis[maxn]; 17 void dijstra(int src) 18 { 19 memset(vis,false,sizeof(vis)); 20 for(int i=1; i<=n; i++) dis[i]=inf; 21 dis[src]=0; 22 for(int i=1; i<=n; i++) 23 { 24 int x,m=inf; 25 for(int y=1; y<=n; y++) if(!vis[y]&&dis[y]<m) m=dis[x=y]; 26 vis[x]=true; 27 for(int y=1; y<=n; y++) dis[y]=min(dis[y],dis[x]+g[x][y]); 28 } 29 } 30 31 void spfa() 32 { 33 queue<int>q; 34 memset(vis,false,sizeof(vis)); 35 for(int i=1; i<=n; i++) dis[i]=inf; 36 for(int i=0; i<w; i++) 37 { 38 dis[c[i]]=0; 39 vis[c[i]]=true; 40 q.push(c[i]); 41 } 42 while(!q.empty()) 43 { 44 int u=q.front(); 45 q.pop(); 46 vis[u]=false; 47 for(int i=1; i<=n; i++) 48 { 49 if(dis[i]>dis[u]+g[u][i]&&g[u][i]!=inf) 50 { 51 dis[i]=dis[u]+g[u][i]; 52 if(!vis[i]) 53 { 54 vis[i]=true; 55 q.push(i); 56 } 57 } 58 } 59 } 60 } 61 62 int main() 63 { 64 while(scanf("%d%d%d",&n,&m,&s)!=EOF) 65 { 66 for(int i=1; i<=n; i++) 67 { 68 for(int j=1; j<=n; j++) 69 { 70 g[i][j]=inf; 71 } 72 } 73 for(int i=0; i<m; i++) 74 { 75 scanf("%d%d%d",&p,&q,&t); 76 g[p][q]=min(g[p][q],t); 77 } 78 scanf("%d",&w); 79 for(int i=0; i<w; i++) 80 { 81 scanf("%d",&c[i]); 82 } 83 spfa(); 84 if(dis[s]==inf) 85 printf("-1\n"); 86 else printf("%d\n",dis[s]); 87 } 88 return 0; 89 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。