您的位置:首页 > 其它

POJ2139 Six Degrees of Cowvin Bacon

2016-08-24 11:12 211 查看
题目来源:http://poj.org/problem?id=2139

题意:有N只牛,在同一部电影Mi里的Ni只牛它们之间的距离为1,当两只牛不在同一部电影里,有第三只牛分别在那两只牛拍的电影里,则它们的距离为2。要求的是以其中一只牛为起点与其他牛之间的距离之和最短。

N<=300,求任意两点的最短距离,直接用Floyd-Warshall算法即可。

#include <iostream>
#include<cstring>
#include<algorithm>
using namespace std;

const int MAXN=305;
int d[MAXN][MAXN];
int n,m;

void floyd();
void solve();
int main()
{
int a[10005],b[305];
cin>>n>>m;
memset(d,MAXN,sizeof(d));
for(int i=1;i<=n;i++)
d[i][i]=0;
for(int i=0;i<m;i++){
cin>>a[i];
for(int j=0;j<a[i];j++)
cin>>b[j];
for(int j=0;j<a[i]-1;j++){
for(int k=j+1;k<a[i];k++){
d[b[j]][b[k]]=d[b[k]][b[j]]=1;
}
}
}
/*
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cout<<d[i][j]<<" ";
}cout<<endl;
}*/
solve();
return 0;
}
void solve(){
floyd();
/*
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cout<<d[i][j]<<" ";
}cout<<endl;
}*/
int ans=MAXN*MAXN;
for(int i=1;i<=n;i++){
int sum=0;
for(int j=1;j<=n;j++){
sum+=d[i][j];
}
ans=min(ans,sum);
}
//cout<<ans<<endl;
ans=ans*1.0/(n-1)*100;
cout<<ans<<endl;
}
void floyd(){
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  最短路径 poj Floyd