题目大意:
给你一个有向图,一个起点集合,一个终点,求最短路。。。。
解题思路:
1.自己多加一个超级源点,把起点集合连接到超级源点上,然后将起点与超级源点的集合的路径长度设为0,这样就称为一个n+1个点的单源最短路算法。
1 #include <stdio.h> 2 #include <string.h> 3 4 int map[1005][1005]; 5 int n; 6 7 int Dijkstra(int s,int e){ 8 bool done[1005]; 9 int d[1005]; 10 memset(done,0,sizeof(done)); 11 for(int i = 0;i <= n;i++) 12 d[i] = (i == s ? 0 : 1000000); 13 for(int i = 0;i <= n;i++){//最多执行n+1次操作 14 int minx,minn = 1000000; 15 for(int j = 0;j <= n;j++)//先找到d[]最小的点 16 if(!done[j] && d[j] < minn){ 17 minn = d[j]; 18 minx = j; 19 } 20 done[minx] = 1;//将该点加入集合 21 if(minx == e) 22 return d[minx]; 23 for(int j = 0;j <= n;j++){//再更新所有的d[] 24 if(!done[j] && d[minx] + map[minx][j] < d[j]){ 25 d[j] = d[minx] + map[minx][j]; 26 } 27 } 28 } 29 return -1;//如果没有找到到终点的路径,返回-1 30 } 31 32 int main(){ 33 int m,s; 34 int i,j,k; 35 int p,q,t; 36 int w,ww,ans; 37 38 while(scanf("%d%d%d",&n,&m,&s) != EOF){ 39 ans = 100000000; 40 for(i = 0;i < 1005;i++){ 41 for(j = 0;j < 1005;j++){ 42 if(i == j) 43 map[i][j] = 0; 44 else 45 map[i][j] = 1000000; 46 } 47 } 48 49 while(m--){ 50 scanf("%d%d%d",&p,&q,&t); 51 if(t < map[p][q])//可能两站间存在多条线路取短的那条路 52 map[p][q] = t; 53 } 54 scanf("%d",&w); 55 while(w--){ 56 scanf("%d",&ww); 57 map[0][ww] = 0; 58 } 59 ans = Dijkstra(0,s);//巧妙之处,加入超级源点0 60 if(ans == -1) 61 printf("-1\n"); 62 else 63 printf("%d\n",ans); 64 } 65 return 0; 66 }
5 8 5 1 2 2 1 5 3 1 3 4 2 4 7 2 5 6 2 3 5 3 5 1 4 5 1 2 2 3 4 3 4 1 2 3 1 3 4 2 3 2 1 1
1 -1
HDOJ 2680 Dijkstra,布布扣,bubuko.com
原文:http://www.cnblogs.com/wushuaiyi/p/3647246.html