http://poj.org/problem?id=2139
N头牛,拍了M部电影,同一部电影中的搭档们距离1,求其中一头牛与其他牛关系路程之和sum最小,输出 sum*100/(n-1)
floyd。
注意: inf不能太大,因为 f[i][k] + f[k][j] 做加法时可能会溢出!
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <algorithm>
using namespace std;
const int INF=99999999;
int n,m;
int dis[305][305];
int v;
int x[305];
int ans=INF;
void floyd(){
for (int k=1;k<=v;k++){
for (int i=1;i<=v;i++){
for (int j=1;j<=v;j++){
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}
}
}
}
int main(){
cin >> v >> m;
for (int i=1;i<=v;i++){
for (int j=1;j<=v;j++){
if (i==j) dis[i][j]=0;
else dis[i][j]=INF;
}
}
while (m--){
cin >> n;
for (int i=1;i<=n;i++){
cin >> x[i];
}
for (int i=1;i<n;i++){
for (int j=i+1;j<=n;j++){
dis[x[i]][x[j]]=dis[x[j]][x[i]]=1;
}
}
}
floyd();
for (int i=1;i<=v;i++){
int sum=0;
for (int j=1;j<=v;j++){
sum+=dis[i][j];
}
ans=min(ans,sum);
}
cout << 100*ans/(v-1) << endl;
}