題意:
數據是否能滿足任何兩個人都可以通過最多六個人認識
即求每個人與其他人的聯繫是否都小於等於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;
}