题目大意
- 给出n个经纪人,接下来的n行,每行的第一个数m代表该经纪人的朋友数。紧接着有m对数,第一数代表朋友编号,第二个表示将消息传给该朋友所需时间。
- 求从某个人开始,将消息传送到所有人所需花费的最少时间。
- 若消息不能传送到每一个人,则输出disjoint。
分析
- 很明显,要求出任意两点的最短路径,用Floyd算法。
- 然后遍历结果数组dis,求出每一行的最大值的最小值即可。
代码
#include <iostream>
using namespace std;
#define INF 0x3fffffff
const int maxn = 110;
int dis[maxn][maxn];
int main()
{
int n;
while(cin >> n && n)
{
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++) dis[i][j] = (i == j ? 0 : INF);
for(int i = 1; i <= n; i++) {
int m; cin >> m;
for(int j = 0; j < m; j++) {
int x , y; cin >> x >> y;
dis[i][x] = y;
}
}
for(int k = 1; k <= n; k++)
{
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
if(dis[i][j] > dis[i][k] + dis[k][j])
dis[i][j] = dis[i][k] + dis[k][j];
}
int pos , ans = INF;
for(int i = 1; i <= n; i++) {
int tmp = 0;
for(int j = 1; j <= n; j++) tmp = max(tmp , dis[i][j]);
if(ans > tmp) {ans = tmp; pos = i;}
}
if(ans == INF) cout << "disjoint" << endl;
else cout << pos << " " << ans << endl;
}
return 0;
}