题意:
在n个顶点的图中求与其他n-1个点最短距离和最小的点,输出 最小化的最短距离和*100/(n-1)。
思路:
floyd求任意两点的最短距离,然后取最优。
代码:
//poj 2139
//sepNINE
#include <iostream>
using namespace std;
const int maxN=312;
int g[maxN][maxN];
int tmp[maxN];
int main()
{
int i,j,k,n,m;
memset(g,-1,sizeof(g));
scanf("%d%d",&n,&m);
for(i=1;i<=n;++i)
g[i][i]=1;
while(m--){
int x;
scanf("%d",&x);
for(i=1;i<=x;++i)
scanf("%d",&tmp[i]);
for(i=1;i<=x;++i)
for(j=1;j<i;++j)
g[tmp[i]][tmp[j]]=g[tmp[j]][tmp[i]]=1;
}
for(k=1;k<=n;++k)
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
if(g[i][k]!=-1&&g[k][j]!=-1)
if(g[i][j]==-1)
g[i][j]=g[i][k]+g[k][j];
else
g[i][j]=min(g[i][j],g[i][k]+g[k][j]);
int ans=INT_MAX;
for(i=1;i<=n;++i){
g[i][0]=0;
for(j=1;j<=n;++j)
if(i!=j)
g[i][0]+=g[i][j];
ans=min(ans,g[i][0]);
}
printf("%d",100*ans/(n-1));
return 0;
}