六度空间
暴力Floyd O(n^3)
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define INF 0xfffffff
#define N 10100
int pri[N][N];//两个顶点之间距离
int n,m;
void floyd()
{
for(int k=1;k<=n;k++)//中间点
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
pri[i][j]=min(pri[i][j],pri[i][k]+pri[k][j]);
}
}
}
}
int main()
{
int sum;
double ans;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
pri[i][j]=i==j?0:INF;
for(int i=1;i<=m;i++)
{
int a,b;
scanf("%d%d",&a,&b);
if(pri[a][b]>1)
pri[a][b]=pri[b][a]=1;
}
floyd();
for(int i=1;i<=n;i++)
{
sum=0;
ans=0;
for(int j=1;j<=n;j++)
{
if(pri[i][j]<=6)
sum++;
}
ans=(double)(sum*1.0/n*100);
printf("%d: %0.2lf%%\n",i,ans);
}
return 0;
}