poj 1502 MPI Maelstrom

题目链接:

  http://poj.org/problem?id=1502

题目大意:

  有一个信息传递系统,含有n个处理器,传递信息的方式是:刚开始编号为1的处理器拥有信息,他可以传给下一个处理器,然后这两个拥有信息的处理器可以同时向下传递给其他两个处理器,拥有信息的四个处理器再依次如此传递,直到所有处理器都接受到信息的最短时间是多少?

解题思路:

  把传递路径画出来,看出可以转化成求从1到其他位置的最短路径中的最长路径,刚看到题目感觉没什么思路,但是建立出来模型以后用dijkstra就好啦!

 1 #include <vector>
 2 #include <queue>
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <cstdlib>
 6 #include <iostream>
 7 #include <algorithm>
 8 using namespace std;
 9 
10 #define maxn 110
11 #define INF 0x3f3f3f3f
12 
13 int map[maxn][maxn], dist[maxn], n;
14 
15 void init ();
16 void dijkstra ();
17 
18 int main ()
19 {
20     while (scanf ("%d", &n) != EOF)
21     {
22         char s[20];
23         init ();
24         for (int i=1; i<=n; i++)
25             for (int j=1; j<i; j++)
26             {
27                 scanf ("%s", s);
28                 if (s[0] <= '9' && s[0] >= '0')
29                 {
30                     map[i][j] = 0;
31                     for (int k=0; s[k]; k++)
32                         map[i][j] = map[i][j] * 10 + s[k] - '0';
33                     map[j][i] = map[i][j];//路径是双向的
34                 }
35             }
36         dijkstra ();
37         int mini = 0;
38         for (int i=2; i<=n; i++)
39             mini = max(mini, dist[i]);
40         printf ("%d\n", mini);
41     }
42     return 0;
43 }
44 
45 void init ()
46 {
47     int i, j;
48     for (i=0; i<maxn; i++)
49         for (j=0; j<maxn; j++)
50             if (i == j)
51                 map[i][j] = 0;//自身到达自身所用花费为零
52             else
53                 map[i][j] = INF;
54 }
55 
56 void dijkstra ()
57 {
58     bool vis[maxn];
59     memset (vis, false, sizeof(vis));
60     for (int i=1; i<=n; i++)
61         dist[i] = map[1][i];
62 
63     vis[1] = true;
64 
65     for (int i=1; i<n; i++)
66     {
67         int temp = INF, index;
68         for (int j=2; j<=n; j++)
69         {
70             if (!vis[j] && temp > dist[j])
71             {
72                 index = j;
73                 temp = dist[j];
74             }
75         }
76 
77         vis[index] = true;
78 
79         for (int j=2; j<=n; j++)
80             if (!vis[j] )
81                 dist[j] = min(dist[j] , dist[index] + map[index][j]);
82     }
83 }

 

posted @ 2015-01-20 22:22  罗茜  阅读(226)  评论(0编辑  收藏  举报