//题意求出一个Num人并给出该人传递信息到最后一个收到该信息的的时间
//floyd算法模板题
//204K 0MS
#include <iostream>
using namespace std;
#define MAX_N 110
#define INF 0x3f3f3f3f
static int n;
static int dp[MAX_N][MAX_N];
static int G[MAX_N][MAX_N];
static void Floyd_warshall()
{
for (int i=1;i<=n;++i)
{
for (int j=1;j<=n;++j)
{
dp[i][j] = INF;
if (G[i][j]!=0)
dp[i][j] = G[i][j];
}
}
for (int k=1;k<=n;++k)
{
for (int i=1;i<=n;++i)
{
for (int j=1;j<=n;++j)
{
if (dp[i][j]>dp[i][k]+dp[k][j])
{
dp[i][j] = dp[i][k] + dp[k][j];
}
}
}
}
int ans1=-1,ans2 = INF;
for (int i=1;i<=n;++i)
{
bool flag = false;
int tmp = -1;//当前是点最晚时间
int tmp1;
for (int j=1;j<=n;++j)
{
if (i!=j&&dp[i][j]==INF){//有不能达到的点
flag = true;
break;
}
if (i!=j&&dp[i][j]>tmp)
{
tmp = dp[i][j];
tmp1 = i;
}
}
if (flag)continue;
if (tmp<ans2)
{
ans1 = tmp1;
ans2 = tmp;
}
}
if (ans1==-1)
printf("disjoint\n");
else
printf("%d %d\n",ans1,ans2);
}
int main()
{
while(scanf("%d",&n)&&n)
{
int num;
memset(G,0,sizeof(G));
for (int i=1;i<=n;++i)
{
scanf("%d",&num);
int t,c;
for (int j=1;j<=num;++j)
{
scanf("%d %d",&t,&c);
G[i][t] = c;
}
}
Floyd_warshall();
}
return 0;
}
POJ1125Floyd-warshall算法模板题
最新推荐文章于 2024-02-18 20:10:18 发布