【解题报告】【HDOJ2544】【Dijkstra最短路】最短路
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544
1 #include<stdio.h> 2 #include<string.h> 3 #define INF 0x3f3f3f3f 4 #define min(a,b) (a>b?b:a) 5 6 int map[101][101]; 7 int n,m; 8 int record[101]; 9 int set[101]; 10 11 void Dijkstra_init() 12 { 13 int a,b,c,i; 14 memset(map,INF,sizeof(map)); 15 memset(record,INF,sizeof(record)); 16 memset(set,0,sizeof(set)); 17 set[1]=1; 18 for(i=0;i<m;i++) 19 { 20 scanf("%d%d",&a,&b); 21 scanf("%d",&c); 22 map[a][b]=min(map[a][b],c); 23 map[b][a]=map[a][b]; 24 if(a==1) record[b]=map[a][b]; 25 if(b==1) record[a]=map[a][b]; 26 } 27 } 28 int small() 29 { 30 int t=INF; 31 int tt,i; 32 for(i=1;i<=n;i++) 33 { 34 if(!set[i]) 35 if(t>record[i]) 36 { 37 t=record[i]; 38 tt=i; 39 } 40 } 41 return tt; 42 } 43 44 45 void Dijkstra() 46 { 47 int t,i,j; 48 for(i=2;i<=n;i++) 49 { 50 t=small(); 51 set[t]=1; 52 for(j=2;j<=n;j++) 53 { 54 if(j!=t){ 55 if(record[j]>record[t]+map[t][j]) 56 record[j]=record[t]+map[t][j]; 57 } 58 } 59 } 60 } 61 62 void Dijkstra_print() 63 { 64 if(n==1) printf("0\n"); 65 else printf("%d\n",record[n]); 66 } 67 68 69 int main() 70 { 71 //freopen("1.txt","r",stdin); 72 while(scanf("%d%d",&n,&m)!=EOF&&(n!=0||m!=0)) 73 { 74 Dijkstra_init(); 75 Dijkstra(); 76 Dijkstra_print(); 77 78 } 79 return 0; 80 }