floyd算法的简单应用,刚开始一直没有通过,试了几组样例,才发现边的插入有问题,只有当a[j]!=a[j]时才插入
#include<bits/stdc++.h>
using namespace std;
const int MAX_N=310;
int g[MAX_N][MAX_N];
const int inf=0x3f3f3f3f;
int n,m;
void init(){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==j){
g[i][j]=0;
}else{
g[i][j]=inf;
}
}
}
}
void insert(int u,int v,int w){
g[u][v]=g[v][u]=w;
}
void floyd(){
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(g[i][j]>g[i][k]+g[k][j]){
g[i][j]=g[i][k]+g[k][j];
}
}
}
}
}
int main(){
scanf("%d%d",&n,&m);
init();
int x;
int a[MAX_N];
//对输入的数据进行处理
for(int i=1;i<=m;i++){
scanf("%d",&x);
for(int j=1;j<=x;j++){
scanf("%d",&a[j]);
}
for(int j=1;j<x;j++){
for(int k=j+1;k<=x;k++){
if(a[j]!=a[k])
insert(a[j],a[k],1);
}
}
}
floyd();
int minx=inf,sum;
for(int i=1;i<=n;i++){
sum=0;
for(int j=1;j<=n;j++){
sum+=g[i][j];
}
if(sum<minx){
minx=sum;
}
}
double ss=(minx*1.0/(n-1));
int cnt=int(ss*100);
printf("%d\n",cnt);
/*double t=n;
cout<<int((minx / (t-1)) * 100)<<endl;*/
return 0;
}