您的位置:首页 > 其它

POJ ACM 1125 Stockbroker Grapevine (最短路Floyd)

2012-08-31 20:28 519 查看
http://poj.org/problem?id=1125

题意:要求找到消息传递给所有人,先传递给谁最快并求出传递的时间.

赤裸裸的Floyd找任意一点到其他点的最短路径

输入:第一行输入一个数字n,表示有n个人. 若n==0表示测试结束.

  接下来输入n行数据,每一行开头输入一个m,表示接受这人消息的人的个数.

  然后输入m对数据,每对数据表示接收消息的人的号码和所需要时间.

输出:输出传递最快的人和传递时间,号码和时间中间有1个空格.

View Code

#include <iostream>
using namespace std;
const int MAX = 100 + 10;
const int INF = 0x3fffffff;
int map[MAX][MAX];
int num;
void floyd()
{
int i,j,k;
for(k=1;k<=num;k++)
{
for(i=1;i<=num;i++)
{
for(j=1;j<=num;j++)
{
if(map[i][k] + map[k][j] < map[i][j])
{
map[i][j] = map[i][k] + map[k][j];
}
}
}
}
}
int main()
{
while(cin>>num,num)
{
int i,j;
for(i=1;i<=num;i++)
{
for(j=1;j<=num;j++)
{
if(i == j)
{
map[i][j] = 0;
}
else
{
map[i][j] = INF;
}

}
}
for(i=1;i<=num;i++)
{
int x;
cin>>x;
for(j=1;j<=x;j++)
{
int a,b;
cin>>a>>b;
map[i][a]=b;
}
}
floyd();
int mid;
int min = 0;
int sum = INF;
int mark;
for(i=1;i<=num;i++)
{
mark = 1;
for(j=1;j<=num;j++)
{
if(map[i][j] == INF)
{
mark = 0;
break;
}
}
if(mark)
{
mid = 0;
for(j=1;j<=num;j++)
{
if(mid < map[i][j])
{
mid = map[i][j];
}
}
if(sum > mid)
{
sum = mid;
min = i;
}
}
}
cout<<min<<' '<<sum<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: