POJ 1502 MPI Maelstrom Dijkstra 算法 单源最短路径

题意:求点1 到其他点的最短路径,然后取它们中的最大值即可

由于矩阵是对称的,所以题目只给了一个下三角矩阵。矩阵如下

 12345
10503010010
2500520x
3305050x
41002050010
510xx100

 

11313383NY_lv101502Accepted276K16MSC++1269B2013-03-05 11:28:10

 

View Code
 1 #include <iostream>
 2 #include <vector>
 3 using namespace std;
 4 
 5 #define MAX(a,b) ((a)>(b)?(a):(b))
 6 
 7 int matrix[105][105];
 8 bool visted[105];
 9 vector<int> dist;
10 int maxx;
11 
12 void Dijkstra(int n)
13 {
14     int i, w;
15     maxx = -1;
16     dist.assign(n+1, INT_MAX);
17     dist[1] = 0;
18 
19     memset(visted, false, sizeof(visted));
20 
21     while (true)
22     {
23         int minn = INT_MAX, v = 1;
24         for (i=1; i<=n; i++)     //得到一个最短的权值
25             if (!visted[i] && minn > dist[i])
26                 minn = dist[i], v = i;
27         visted[v] = true;
28         if (minn == INT_MAX) 
29             break;
30 
31         for (w=1; w <=n; w++)
32         {
33             if (!visted[w] && matrix[v][w] < INT_MAX && dist[w] > dist[v] + matrix[v][w])    //逐一修改所有的路径使之趋近最短
34                 dist[w] = dist[v] + matrix[v][w];
35         } 
36         //在最短权值中取得一个最大的
37         maxx=MAX(maxx,dist[v]);
38     }
39 }
40 
41 int main()
42 {
43     int i, j, k;
44     int n;
45     char str[100];
46     while (scanf("%d",&n) != EOF)
47     {
48         memset(matrix, 0, sizeof(matrix));
49         for (i=2; i<=n; i++)
50         {
51             for (j=1; j<i; j++)
52             {
53                 scanf("%s", &str);    
54                 if (str[0] == 'x')
55                     matrix[i][j] = INT_MAX;    
56                 else
57                 {
58                     int len = strlen(str);
59                     for (k=0; k<len; k++)
60                     {
61                         matrix[i][j] *= 10;
62                         matrix[i][j] += str[k] - '0';
63                     }
64                 }
65                 matrix[j][i] = matrix[i][j];
66             }
67         }
68         Dijkstra(n);
69         cout<<maxx<<endl;
70     }
71     return 0;
72 }

 

 

 

转载于:https://www.cnblogs.com/lv-2012/archive/2013/03/05/2944038.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值