POJ 1502( dijkstra)

       这个题好像有点长,不过意思很简单。

       就是第一个processor向和它相邻的processor发送消息,那么接收到消息的processor就可以向和它们相邻的processor发送消息。求所有processor都接受到消息所需的最短的时间。从数据结构来考虑,就是最短路了。求第一个点到其余各点最短路径的最大值(因为其余点时间比最大值小,故可以接收到消息,消息是同时发送的)。

代码:

 1 #include<iostream>
2 #include<cstdlib>
3 #include<cstring>
4 #define max 0x7fffffff
5 using namespace std;
6
7 int p[101][101];
8 int dis[101];
9 bool flag[101];
10 int dijkstra(int n);
11
12 int main()
13 {
14 int i,j,n;
15 char ch[20];
16 cin>>n;
17 for(i = 1 ; i < n ; ++i)//只输入下三角(并且不包括那个对角线)
18 for(j = 0 ; j < i ; ++j)
19 {
20 cin>>ch;
21 if(ch[0] == 'x')//不可达
22 p[i][j] = p[j][i] = max;
23 else
24 p[i][j] = p[j][i] = atoi(ch);//将字符串转换为int
25 }
26 for(i = 0 ; i < n ; ++i)
27 p[i][i] = 0;//自己到自己为0
28 memset(flag,false,sizeof(flag));//初始,最短路径集合里没元素
29 printf("%d\n",dijkstra(n));
30
31 // system("pause");
32 return 0;
33 }
34
35 int dijkstra(int n)
36 {
37 int u,i,j,tdis,newdis;
38 for(i = 0 ; i < n; ++i)//起点是第一个processor
39 dis[i] = p[0][i];
40 flag[0] = true;//将起点加入最短路径集合
41
42 for(j = 1 ; j < n ; ++j)//还有n-1个点未加入最短路径集合
43 {
44 tdis = max;
45 for(i = 0 ; i < n ; ++i)//寻找下一个应该进入最短路径集合的processor
46 {
47 if( !flag[i] && dis[i] < tdis)
48 {
49 u = i ; tdis = dis[i];
50 }
51
52 }//for(i)
53
54 flag[u] = true;//进入最短路径集合
55
56 for(i = 0 ; i < n ; ++i)//根据新加入的那个点更新其余点的最短路径
57 {
58 if( !flag[i] && p[u][i] != max)
59 {
60 newdis = dis[u] + p[u][i];
61 if(newdis < dis[i])
62 dis[i] = newdis;
63 }
64
65 }
66
67 }//for(j)
68 tdis = 0 ;
69 for(i = 1 ; i < n ; ++i)//找出最大值
70 if(dis[i] > tdis)
71 tdis = dis[i];
72
73 return tdis;
74 }
原文地址:https://www.cnblogs.com/HpuAcmer/p/2300937.html