题意:
数据是否能满足任何两个人都可以通过最多六个人认识
即求每个人与其他人的联系是否都小于等于7
用Floyd 无向图 初始有联系的标记1
mp[i][j]加点k,使数组内最后剩下的是第i人与其他人之间的路径长度,即可以通过几个人认识
如第一组数据的mp为
0 1 2 3 4 5 6 7
1 0 1 2 3 4 5 6
2 1 0 1 2 3 4 5
3 2 1 0 1 2 3 4
4 3 2 1 0 1 2 3
5 4 3 2 1 0 1 2
6 5 4 3 2 1 0 1
7 6 5 4 3 2 1 0
mp值最远的为7也可以通过六人联系
如不连通,即无法跟某些人有联系,值为inf,自然比7大,不满足
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int inf=0x3f3f3f3f;
int mp[105][105],n,m,a,b;
void Floyd()
{
for(int k=0;k<n;k++)
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
if(i!=j)
mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]);
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
int flag=0;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
mp[i][j]=i==j?0:inf;
//memset(mp,inf,sizeof(mp));
for(int i=0;i<m;i++)
{
cin>>a>>b;
mp[a][b]=mp[b][a]=1;
}
Floyd();
for(int i=0;i<n;i++)
{
for(int j=0;j<n&&!flag;j++)
{
if(i!=j&&mp[i][j]>7)
{
flag=1;
}
}
}
if(!flag)
cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}