HDU 1874 畅通工程续 (Dijkstra算法)

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 #define MAX_VERTEXT 250
 6 const int MAX_WEIGHT= 0x7f7f7f7f;
 7 
 8 int map[MAX_VERTEXT][MAX_VERTEXT];
 9 int path[MAX_VERTEXT];
10 
11 void Init()
12 {
13     memset(map,MAX_WEIGHT,sizeof(map));
14     memset(path,MAX_WEIGHT,sizeof(path));
15 }
16 
17 void Input(int m)
18 {
19     int start,end,weight;
20     for (int i=0;i<m;i++)
21     {
22         cin>>start>>end>>weight;                    
23         //这里太BT了。。。
24         if (weight<map[start][end])
25             map[start][end]=map[end][start]
26                             =weight;
27         if(start==end)
28             map[start][end]=0;
29     }
30 }
31 
32 template<typename T>
33 T min(const T& x,const T& y)
34 {
35     return x<y ? x:y;
36 }
37 
38 int Dijkstra(int n,int s,int e)
39 {
40     int i,j,k;
41     int v[MAX_VERTEXT]={0};
42     for (path[s]=0,i=0;i<n;i++)
43     {
44         //把顶点分成两个集合S,U(U为剩余顶点集)
45         //一开始S中只有s顶点(开始点)
46         //从剩余的顶点中挑选路径最短的加入S
47         for(k=-1,j=0;j<n;j++)
48             if(!v[j]&&(k==-1||path[j]<path[k]))
49                 k=j;
50 
51         for(v[k]=1,j=0;j<n;j++)
52             if(!v[j]&&(map[k][j]!=MAX_WEIGHT))
53                 path[j]=::min(path[k]+map[k][j],path[j]);
54     }
55     if(path[e]>=MAX_WEIGHT)
56         return -1;
57     else
58         return path[e];
59 }
60 
61 int main()
62 {
63     int N,M,start,end;
64     while(cin>>N>>M)
65     {
66         Init();
67         Input(M);
68         cin>>start>>end;
69         if(start==end)
70             cout<<"0"<<endl;
71         else
72             cout<<Dijkstra(N,start,end)<<endl;
73     }
74     return 0;
75 }

posted on 2012-08-12 16:35  mycapple  阅读(211)  评论(0编辑  收藏  举报

导航