题意:如上图。
算法:Floyd
问题:注意不能将上限像dijkstra算法一样开满(0x7fffffff),否则三重循环最里面还需要判断一下i到k和k到j是不是inf
思路: 将两人初始关系看作1,每多一个人,距离加1,任意两人距离要求小于等于7。
代码:ac
#include<bits/stdc++.h>
using namespace std;
#define inf 10000
int d[110][110];
int n, m;
int a, b;
int main()
{
while (scanf("%d%d", &n, &m) != EOF) {
int flag = 1;
for(int i=0;i<n;i++)
for (int j = 0; j < n; j++) {
if (i == j)d[i][j] = 0;
else d[i][j] = inf;
}
while (m--) {
scanf("%d%d", &a, &b);
d[a][b] = 1;
d[b][a] = 1;
}
for(int k=0;k<n;k++)
for(int i=0;i<n;i++)
for (int j = 0; j < n; j++) {
/*if (d[i][k] != inf && d[k][j] != inf) {*/
if (d[i][j] > d[i][k] + d[k][j])
d[i][j] = d[i][k] + d[k][j];
/* }*/
}
for(int i=0;i<n;i++)
for (int j = 0; j < n; j++) {
if (d[i][j] == inf || d[i][j] >7) {
flag = 0;
break;
}
}
if (flag)printf("Yes\n");
else printf("No\n");
}
return 0;
}