题目链接:
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 }
时间: 2024-12-21 01:34:49