经典经典题啊!
那个poj题号1125,题目巨长,找度娘撒~~
先来介绍一下我们可爱的floyd算法,没错可爱,因为它的核心只有5行,戳这里有讲的特别棒!!@坐在马桶上看算法戳这
核心代码部分【当然你可以写成4行
其实它有动归的思想在啊
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(e[i][j]>e[i][k]+e[k][j])
e[i][j]=e[i][k]+e[k][j];
那么下面就是1125
#include <cstdio>
#include <cstring>
using namespace std;
const int INF = 0x3f;
const int MAXN = 105;
int adj[MAXN][MAXN];
int n;
void Floyd()
{
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(adj[i][j]>adj[i][k] + adj[k][j])
adj[i][j] = adj[i][k] + adj[k][j];
}
int main()
{
while(scanf("%d",&n),n)
{
memset(adj,0x3f,sizeof(adj));
for(int i=1,m;i<=n;i++)
{
adj[i][i] = 0;//到自己的时间为0
scanf("%d",&m);
for(int k=1,j,w;k<=m;k++)
{
scanf("%d %d",&j,&w);
adj[i][j] = w;
}
}
Floyd();
int s = 0,cost = INF;
int tot;
for(int i=1;i<=n;i++)
{
tot = 0;
for(int j=1;j<=n;j++)
{
if(tot<adj[i][j])
tot = adj[i][j];
}
if(tot<cost)
{
cost = tot;
s = i;
}
}
if(cost == INF)
printf("disjoint\n");
else
printf("%d %d\n",s,cost);
}
}