用Floyd算出每个点到其他点的最短路径,再求每个点的平均值的100倍,取整形,100×g[i][0]/(n-1),我写成了100×(g[i][0]/(n-1)),把小数部分本来要扩大的给省去了。。。贡献2次WA 代码: #include<iostream> using namespace std; int g[301][301]; int d[301]; void init(int n) { int i,j; for(i=1;i<=n;i++) for(j=1;j<=n;j++) { if(i!=j) g[i][j]=999999; } } int min(int a,int b) { return a<b?a:b; } int main() { int i,j,n,m,k,h,x,a,b,ans; cin>>n>>m; init(n); while(m--) { cin>>x; for(i=1;i<=x;i++) cin>>d[i]; for(i=1;i<=x;i++) for(j=i+1;j<=x;j++) { g[d[i]][d[j]]=g[d[j]][d[i]]=1; } } for(k=1;k<=n;k++) for(i=1;i<=n;i++) for(j=1;j<=n;j++) { g[i][j]=min(g[i][j],g[i][k]+g[k][j]); } ans=999999; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) g[i][0]+=g[i][j]; g[i][0]=100*g[i][0]/(n-1); ans=min(ans,g[i][0]); } cout<<ans<<endl; //printf("%d/n",int(ans*100/(n-1))); system("pause"); return 0; }