BNUOJ 6023 畅通工程续

畅通工程续

Time Limit: 1000ms
Memory Limit: 32768KB
This problem will be judged on  HDU. Original ID: 1874
64-bit integer IO format: %I64d      Java class name: Main
 
某省自从实行了很多年的畅通工程计划后,终于修建了很多路。不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多。这让行人很困扰。

现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离。
 

Input

本题目包含多组数据,请处理到文件结束。
每组数据第一行包含两个正整数N和M(0<N<200,0<M<1000),分别代表现有城镇的数目和已修建的道路的数目。城镇分别以0~N-1编号。
接下来是M行道路信息。每一行有三个整数A,B,X(0<=A,B<N,A!=B,0<X<10000),表示城镇A和城镇B之间有一条长度为X的双向道路。
再接下一行有两个整数S,T(0<=S,T<N),分别代表起点和终点。
 

Output

对于每组数据,请在一行里输出最短需要行走的距离。如果不存在从S到T的路线,就输出-1.
 

Sample Input

3 3

0 1 1

0 2 3

1 2 1

0 2

3 1

0 1 1

1 2

Sample Output

2

-1

Source

 
解题:很水的题目!纯粹是为了学习下Dijkstra算法的优先队列优化。。哎 错了好多次!我逗逼了。。。
 
 1 #include <iostream>

 2 #include <cstdio>

 3 #include <cstring>

 4 #include <cmath>

 5 #include <algorithm>

 6 #include <climits>

 7 #include <vector>

 8 #include <queue>

 9 #include <cstdlib>

10 #include <string>

11 #include <set>

12 #include <stack>

13 #define LL long long

14 #define pii pair<int,int>

15 #define INF 0x3f3f3f3f

16 using namespace std;

17 const int maxn = 210;

18 int n,m,mp[maxn][maxn],d[maxn],s,t;

19 bool done[maxn];

20 priority_queue< pii,vector< pii > ,greater< pii > >q;

21 void dijkstra(int s){

22     while(!q.empty()) q.pop();

23     int i,j,u,v;

24     for(i = 0; i < n; i++){

25         done[i] = false;

26         d[i] = INF;

27     }

28     d[s] = 0;

29     q.push(make_pair(d[s],s));

30     while(!q.empty()){

31         u = q.top().second;

32         q.pop();

33         if(done[u]) continue;

34         done[u] = true;

35         for(v = 0; v < n; v++){

36             if(d[u] < INF && mp[u][v] < INF && d[v] > d[u]+mp[u][v]){

37                 d[v] = d[u]+mp[u][v];

38                 q.push(make_pair(d[v],v));

39             }

40         }

41         if(done[t]) return;

42     }

43 }

44 int main() {

45     int i,j,u,v,w;

46     while(~scanf("%d %d",&n,&m)){

47         for(i = 0; i < n; i++){

48             for(j = 0; j < n; j++)

49                 mp[i][j] = INF;

50         }

51         for(i = 0; i < m; i++){

52             scanf("%d %d %d",&u,&v,&w);

53             if(mp[u][v] > w) mp[u][v] = mp[v][u] = w;

54         }

55         scanf("%d %d",&s,&t);

56         dijkstra(s);

57         printf("%d\n",d[t] == INF?-1:d[t]);

58     }

59     return 0;

60 }
View Code

 

 1 #include <iostream>

 2 #include <cstdio>

 3 #include <cstring>

 4 #include <cmath>

 5 #include <algorithm>

 6 #include <climits>

 7 #include <vector>

 8 #include <queue>

 9 #include <cstdlib>

10 #include <string>

11 #include <set>

12 #include <stack>

13 #define LL long long

14 #define INF 0x3f3f3f3f

15 using namespace std;

16 const int maxn = 210;

17 int n,m,s,t,d[maxn],mp[maxn][maxn];

18 bool done[maxn];

19 void spfa(int s){

20     int i,j,u,v;

21     queue<int>q;

22     for(i = 0; i < n; i++)

23         d[i] = INF;

24     memset(done,false,sizeof(done));

25     d[s] = 0;

26     q.push(s);

27     done[s] = true;

28     while(!q.empty()){

29         u = q.front();

30         q.pop();

31         done[u] = false;

32         for(v = 0; v < n; v++){

33             if(d[v] > d[u]+mp[u][v]){

34                 d[v] = d[u]+mp[u][v];

35                 if(!done[v]){

36                     done[v] = true;

37                     q.push(v);

38                 }

39             }

40         }

41     }

42 }

43 int main(){

44     int i,j,u,v,w;

45     while(~scanf("%d %d",&n,&m)){

46         for(i = 0; i < n; i++)

47             for(j = 0; j < n; j++)

48             mp[i][j] = INF;

49         for(i = 0; i < m; i++){

50             scanf("%d %d %d",&u,&v,&w);

51             if(mp[u][v] > w) mp[u][v] = mp[v][u] = w;

52         }

53         scanf("%d %d",&s,&t);

54         spfa(s);

55         printf("%d\n",d[t] == INF?-1:d[t]);

56     }

57     return 0;

58 }
View Code

 

你可能感兴趣的:(OJ)