您的位置:首页 > 其它

poj 1125 floyd

2016-03-11 23:46 267 查看
经典经典题啊!

那个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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj