题目链接:https://cn.vjudge.net/contest/314508#problem/I
翻译:N个人,编号为0~N-1,M组关系,问是否符合题目中描述的现象?
分析:
要抓住题意的要点–任何2个素不相识的人中间最多只隔着6个人,即只用6个人就可以将他们联系在一起。任何两个字表明该用Floyd-Warshal算法求最短路。
算法核心代码:
for(int k=1; k<=n; k++)
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
if(e[i][j]>e[i][k]+e[k][j])
e[i][j]=e[i][k]+e[k][j];
k为中转的点
代码:
#include<cstdio>//Floyd-Warshall---多源最短路径问题
#include<cstring>
#include<algorithm>
using namespace std;
#define INF 0x3f3f3f3f
int n,m,flag;
int e[102][102];
void solve(){
for(int k=0; k<n; k++){
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
if(e[i][k]!=INF&&e[k][j]!=INF&&i!=j){
if(e[i][j]>e[i][k]+e[k][j]){
e[i][j]=e[i][k]+e[k][j];
}
}
}
}
}
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
if(e[i][j]>7||e[i][j]==INF){
flag=1;
break;
}
}
if(flag==1)
break;
}
}
int main(){
while(~scanf("%d%d",&n,&m)){
flag=0;
for(int i=0; i<n; i++)
for(int j=0; j<n; j++){
if(i==j)e[i][j]=0;
else
e[i][j]=INF;
}
int a,b;
for(int i=0; i<m; i++){
scanf("%d%d",&a,&b);
e[a][b]=e[b][a]=1;
}
solve();
if(flag)
printf("No\n");
else
printf("Yes\n");
}
return 0;
}