题意:牛去拍电影,在同一场表演的牛的距离为1,牛与牛之间的距离可以是间接的,例如a和b拍一场,b和c拍一场,a和c之间没在同一场拍,则a和c的距离为2,求牛与其他牛的距离最小平均值,自己和自己距离为0。最小的平局值乘一百输出。
题解:floyd裸题。
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <cstring>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#define ll long long
#define Max 310
#define INF 1e9+7
using namespace std;
int dp[Max][Max];
int a[Max];
void init(int n){
for(int i = 0 ; i <= Max ; i++){
for(int j = 0 ; j <= Max ; j++){
dp[i][j] = INF;
}
dp[i][i] = 0;
}
}
void floyd(int n){
for(int k = 1 ; k <= n ; k++){
for(int i = 1 ; i <= n ; i++){
for(int j = 1 ; j <= n ; j++){
dp[i][j] = min(dp[i][j],dp[i][k]+dp[k][j]);
}
}
}
}
int main(){
int n,m,x;
cin>>n>>m;
init(n);
while(m--){
scanf("%d",&x);
for(int i = 0 ; i < x ; i++){
scanf("%d",&a[i]);
}
for(int i = 0 ; i < x ; i++){
for(int j = i+1 ; j < x; j++){
dp[a[i]][a[j]] = 1;
dp[a[j]][a[i]] = 1;
}
}
}
floyd(n);
// for(int i = 1 ; i <= n ; i++){
// for(int j = 1 ; j <= n; j++){
// cout<<dp[i][j]<<" ";
// }
// cout<<endl;
// }
int cnt = INF;
for(int i = 1 ; i <= n ; i++){
int k = 0;
for(int j = 1 ; j <= n ; j++){
k+=dp[i][j];
// cout<<k<<" ";
}
// cout<<endl;
cnt = min(k,cnt);
}
cout<<100*cnt/(n-1)<<endl;
}