题目链接:http://poj.org/problem?id=1046
题意:股票经纪人要在一群人中散布一个传言,传言只能在认识的人中传递,题目将给出人与人的关系(是否认识),以及传言在某两个认识的人中传递所需的时间,要求程序给出以哪个人为起点,可以在好事最短的情况下,让所有人收到消息。
简化为有向连同图的最短路径问题,用floyd算法算法最简单,flyod算法的实现,我根据伪代码编写的:
1 2 3 4 5 6 7 8 9 10 11
| void floyd() { for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(d[i][k]+d[k][j]<d[i][j]) d[i][j]=d[i][k]+d[k][j]; return; }
|
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
|
#include <iostream> #include <cstdio> #include <cstring> using namespace std; #define INF 0xFFFFF
int n,d[105][105];
void floyd() { for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(d[i][k]+d[k][j]<d[i][j]) d[i][j]=d[i][k]+d[k][j]; return; }
int main() { int i,j,m; while(cin>>n&&n;) { for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(i==j) d[i][j]=0; else d[i][j]=INF; for(i=1;i<=n;i++) { cin>>m; for(j=1;j<=m;j++) { int p,c; cin>>p>>c; d[i][p]=c; } } floyd(); int p,min=INF,max; for(i=1;i<=n;i++) { max=0; for(j=1;j<=n;j++) if(d[i][j]>max) max=d[i][j]; if(max<min) { min=max; p=i; } } if(min==INF) cout<<"disjoint"<<endl; else cout<<p<<" "<<min<<endl; } }
|