您的位置:首页 > 其它

POJ 1125 Stockbroker Grapevine Floyd .

2016-08-17 13:47 337 查看
题目地址:http://poj.org/problem?id=1125

找出能让所有人知道消息的且最快的那个人,还要记录那个人传播中耗时间最长的另一人

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int INF=1000000000;
const int maxn=100+5;
int dist[maxn][maxn];
int G[maxn][maxn]; //保存图 (邻接矩阵)
int Floyd(int n)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(G[i][j]==0) dist[i][j]=INF;
else dist[i][j]=G[i][j];
}
for(int k=1;k<=n;k++) //中间经过k-1个点
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
dist[i][j]=min(dist[i][j],dist[i][k]+dist[k][j]);
}
bool solve(int n)
{
int MinT=INF,MaxT,Max;
int pMin,rMax;
for(int i=1;i<=n;i++)
{
int sum=0,MaxT=0;
for(int j=1;j<=n;j++)
{
if(i==j) continue;
sum+=dist[i][j];
if(dist[i][j]>MaxT){
MaxT=dist[i][j];
}
if(sum>MinT) break;
}
if(MinT>sum) {
pMin=i;
MinT=sum;
Max=MaxT;
}
}
if(MinT>=INF) return false;
cout<<pMin<<' '<<Max<<endl;
return true;
}
int main()
{
int n,u,v,w,m;
while(cin>>n,n)
{
memset(G,0,sizeof(G));
for(int u=1;u<=n;u++)
{
cin>>m;
while(m--)
{
cin>>v>>w;
G[u][v]=w;
}
}
Floyd(n);
if(!solve(n)) cout<<"disjoint"<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: