题意:有n头牛,如果两头牛同拍一部电影,这他们之间的距离为一,如果两头牛都和第三头牛拍过同一部电影,那么它们之间的距离经第三头牛传递就为2,,,求那一头牛与其它牛距离的平均值最小,把他乘一百输出。(求的时候,先扩大一百倍再求平均值)
思路:floyd算法的入门题,只有把输入数据转换为图的邻接矩阵表示就好
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 350;
const int INF = 0x3f3f3f3f;
int t,n,m;
int G[MAXN][MAXN];//保存<v,i>的权值 (相邻为1);
int v[MAXN];
void init()//floyd算法的初始化,i==j 时 G[i][v] = 0 其余都为 INF;
{
for(int i=0;i<=n;i++)
{
for(int j=0;j<=n;j++)
{
if(i==j)
G[i][j] = 0;
else
G[i][j] = INF;
}
}
}
int main()
{
while(cin>>n>>m)
{
init();
while(m--)
{
cin>>t;
for(int i=1;i<=t;i++)//输入同一个电影中牛的编号
cin>>v[i];
for(int i=1;i<=t;i++)//转换为邻接矩阵的表达形式
{
for(int j=i+1;j<=t;j++)
{
G[v[i]][v[j]] = G[v[j]][v[i]] = 1;
}
}
}
for(int k=1;k<=n;k++)//floyd 算法
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
G[i][j] = min(G[i][j],G[i][k]+G[k][j]);
double themin = INF;
for(int i=1;i<=n;i++)//求每一个定点到其他所有顶点的最短距离和的平均值
{
double sum = 0;
for(int j=1;j<=n;j++)
{
sum += G[i][j];
}
themin = min(themin,sum/(n-1));
}
printf("%d",int(themin*100));//看到评论区说好像是截位输出,而不是四舍五入
}
return 0;
}
奈何我冒泡的算法如何打动你超时的心!!!