您的位置:首页 > 其它

POJ Stockbroker Grapevine 1125 多源最短路(Floyd)

2014-12-05 10:00 573 查看
题目大意:

股票经纪人要散播股票的谣言,每个人都有人际关系,每个人只信任他相信的人传播的谣言, 其实也就是有向图。问 哪个人能最快的将谣言传播给所有人,并且求出传过去的最短时间。

题目分析:

我们用Floyd求出每个点的最短路,

然后搜索每个点,看和这个点所连接点的最长时间就是这个人散播最后谣言的时间

然后从所有的点中找出时间最长的点

#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
#define INF 0xfffffff
#define maxn 150

int G[maxn][maxn];
int n;

void Floyd()
{
for(int k=1; k<=n; k++)
{
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
G[i][j] = min(G[i][j],G[i][k] + G[k][j]);
}
}
}
int Min = INF, index = 1;

for(int i=1; i<=n; i++)
{
int Max = 0;
for(int j=1; j<=n; j++)
{
Max = max(Max,G[i][j]);
}
if(Max < Min)
{
Min = Max;
index = i;
}
}

if(Min == INF)
printf("disjoint\n");
else
printf("%d %d\n",index,Min);

}
void Init()
{
for(int i=0; i<=n; i++)
{
G[i][i] = 0;
for(int j=0; j<i; j++)
G[i][j] = G[j][i] = INF;
}
}

int main()
{
while(cin >> n, n)
{
int t, e, w;
Init();
for(int i=1; i<=n; i++)
{
cin >> t;
for(int j=0; j<t; j++)
{
cin >> e >> w;
G[i][e] = min(G[i][e],w);
}
}

Floyd();

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: