标签:
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 33724 Accepted Submission(s):
12329
#include<stdio.h> #include<string.h> #define INF 0x3f3f3f int lowdis[210],map[210][210],visit[210]; int city; int begin,end; void dijkstra() //此算法与prime最小生成树算法比较相似 { int j,i,mindis,next; memset(visit,0,sizeof(visit)); for(i=0;i<city;i++) { lowdis[i]=map[begin][i]; //因为题目中要求的有起始点和终点,所以此处应先初始化lowdis数组 } //为从起始点到其余所有点的距离 visit[begin]=1; //首先将起始点放入最短路径数组 for(i=0;i<city-1;i++) { mindis=INF; for(j=0;j<city;j++) { if(!visit[j]&&mindis>lowdis[j]) { mindis=lowdis[j]; next=j; } } /*if(mindis==IFN) { printf("-1\n"); //(1) } */ visit[next]=1; for(j=0;j<city;j++) { if(!visit[j]&&lowdis[j]>map[next][j]+lowdis[next]) lowdis[j]=map[next][j]+lowdis[next]; } } if(lowdis[end]==INF) //如果到终点的最短路径为无穷大则无通路(注意,此处的有无通路判断与最小生成树中的判断有一定区别 printf("-1\n"); //如题解所说,最短路径问题中两个节点之间可能存在多条通路,所以(1)处即使mindis等于无穷也可能有其他通路) else printf("%d\n",lowdis[end]); } int main() { int i,j,road,x,y,c; while(scanf("%d%d",&city,&road)!=EOF) { for(i=0;i<city-1;i++) { for(j=i+1;j<city;j++) { if(i==j) map[i][j]=0; else map[i][j]=map[j][i]=INF; } } while(road--) { scanf("%d%d%d",&x,&y,&c); if(map[x][y]>c) { map[x][y]=map[y][x]=c; } } scanf("%d%d",&begin,&end); dijkstra(); } return 0; }
标签:
原文地址:http://www.cnblogs.com/tonghao/p/4505828.html