http://acm.hdu.edu.cn/showproblem.php?pid=2066
6 2 3 1 3 5 1 4 7 2 8 12 3 8 4 4 9 12 9 10 2 1 2 8 9 10
9
#include<stdio.h> #include<string.h> #define INF 0x3f3f3f3f int map[1010][1010]; int dis[1010]; bool used[1010]; int n; int i,j; void dijkstra() { int i,j; memset(used,0,sizeof(used)); for(i=0;i<=1000;++i) dis[i]=INF; int pos; for(i=0;i<=1000;++i)//第一次给dis赋值 { dis[i]=map[0][i]; } dis[0]=0; used[0]=1; for(i=0;i<1000;++i)//最多运行n次 { int min=INF; for(j=0;j<=1000;++j) { if(!used[j]&&dis[j]<min) { min=dis[j]; pos=j; } } used[pos]=1; dis[pos]=min; for(j=0;j<=1000;++j)//把dis数组更新,也叫松弛 { if(!used[j]&&dis[j]>map[pos][j]+dis[pos]) { dis[j]=map[pos][j]+dis[pos]; } } } } int main() { int m,T; int u,v,w; int temp; int a[1010],b[1010]; while(~scanf("%d%d%d",&n,&m,&T)) { for(i=0;i<=1000;++i) for(j=0;j<=i;++j) map[i][j]=map[j][i]=INF; for(i=1;i<=n;++i) { scanf("%d%d%d",&u,&v,&w); if(map[u][v]>w) map[u][v]=map[v][u]=w; } for(i=1;i<=m;++i) { scanf("%d",&temp); map[0][temp]=0; } dijkstra(); int min=INF; for(i=1;i<=T;++i) { scanf("%d",&temp); if(dis[temp]<min) min=dis[temp]; } printf("%d\n",min); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/yuzhiwei1995/article/details/47732803