【解题报告】【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 }

 

posted on 2012-07-21 18:25  coding封神  阅读(118)  评论(0编辑  收藏  举报

导航