#include <iostream>
#include <stdio.h>
#include <memory.h>
using namespace std;
const int INF=0X3f3f3f3f;
const int MAXN=300+5;
int dp[MAXN][MAXN];
int g[MAXN][MAXN];
int main()
{
int N,M;
while(~scanf("%d %d",&N,&M))
{
memset(dp,0x3f,sizeof(dp));//全部初始化为无穷大
memset(g,0,sizeof(g));
for(int i=1;i<=M;i++)
{
int temp;
scanf("%d",&temp);
g[i][0]=temp;
int j=1;
while(j<=temp)
scanf("%d",&g[i][j++]);
}
for(int i=1;i<=M;i++)
{
for(int j=1;j<=g[i][0];j++)
{
for(int k=j;k<=g[i][0];k++)
{
dp[g[i][k]][g[i][j]]=dp[g[i][j]][g[i][k]]=(k==j?0:1);
}
}
}
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 MIN=0x3f3f3f3f;
for(int i=1;i<=N;i++)
{
int sum=0;
for(int j=1;j<=N;j++)
sum+=dp[i][j];
MIN=min(MIN,sum);
}
printf("%d\n",MIN*100/(N-1));
}
return 0;
}
题目链接:http://poj.org/problem?id=2139
题意:n头奶牛,m部电影,每部电影告诉你是哪几头奶牛.如果两头奶牛在一起出演就相互度=1,如果两头奶牛没有一起出演过,但是同时跟第三头奶牛出演过,那么这两头奶牛的相互度就等于他们与第三头奶牛的相互度之和。要求输出牛的最小平均分开度的100倍。这题目也够难懂得。最坑爹的地方是没有给出输出的格式,不知道是进位还是去尾。因此,我贡献了两次WA。
解题思路:很明显该题就是让我们求出两点之间的最短路径,并且数据量又小,所以用Floyd算法即可。