题目来源:poj 1125 股票经纪人
思路:
先用Floyd算法求出全局最短路径。然后遍历每一行分别求出从1到N作为第一个人开始散播消息所需时间(最长时间),再求出这些所有时间中的最短时间。
#include <iostream>
using namespace std;
const int maxn = 110;
const int INF = 0x3fffffff;
int dis[maxn][maxn];
int n, m; //顶点数,边数
void Floyd()
{
for (int k = 1; k <= n; k++)
{
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
if (dis[i][k] != INF && dis[k][j] != INF && dis[i][k] + dis[k][j] < dis[i][j])
{
dis[i][j] = dis[i][k] + dis[k][j];
}
}
}
}
}
int main()
{
while (scanf("%d", &n) && n)
{
fill(dis[0], dis[0] + maxn * maxn, INF);
for (int i = 1; i <= n; i++)
{
dis[i][i] = 0;
}
for (int i = 1; i <= n; i++)
{
int m;
scanf("%d", &m);
int v, w;
for (int j = 1; j <= m; j++)
{
scanf("%d%d", &v, &w);
dis[i][v] = w;
}
}
Floyd();
int index = 0;
int ans = INF;
for (int i = 1; i <= n; i++)
{
int res = 0;
bool flag = true;
for (int j = 1; j <= n; j++)
{
if (dis[i][j] != INF && dis[i][j] > res)
{
res = dis[i][j];
}
else if (dis[i][j] == INF)
{
flag = false;
break;
}
}
if (flag && ans > res)
{
index = i;
ans = res;
}
}
if (ans != INF)
{
cout << index << ' ' << ans << endl;
}
else
{
cout << "disjoint" << endl;
}
}
return 0;
}