题目:六度分离
题目链接:https://vjudge.net/contest/351234#problem/C
题目描述:给出图,判断任意两点能不能七步之内互通。
题目分析:由于是七步之内,所以用DFS就能解决,找关系的文题然后就要检查看各点的跑点情况。
代码:
#include <stdio.h>
#include <stdlib.h>
int n,m,b[102],d[102],c[102];
struct Way
{
int begin;
int end;
}a[500];
int clean(int *x,int y,int z) //用来初始化
{
int i;
for(i=0;i<y;i++)
x[i]=z;
return 0;
}
int comp(const void *p1,const void *p2)
{
return (*(struct Way*)p2).begin>(*(struct Way*)p1).begin?-1:1;
}
int dfs(int x,int y) //搜索用
{
if(c[x]) return 0; //搜索过点不要
c[x]=1;//标记已走
int i;
for(i=d[x];i<2*m;i++)
{
if(a[i].begin!=x) break;
if(y<b[a[i].end]) b[a[i].end]=y;
if(y<7) dfs(a[i].end,y+1);//深度7
}
c[x]=0;//解除标记
return 0;
}
int cheak(int x)//检查各点可跑情况
{
int i;
b[x]=0;
c[x]=1;
for(i=d[x];i<2*m;i++)
{
if(a[i].begin!=x) break;
b[a[i].end]=1;
dfs(a[i].end,2);
}
for(i=0;i<n;i++)
{
if(b[i]>7) break;
}
if(i==n) return 0;
else return 1;
}
int main()
{
int i,p;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=0;i<2*m;i+=2)
{
scanf("%d%d",&a[i].begin,&a[i].end);
a[i+1].begin=a[i].end;
a[i+1].end=a[i].begin;
}
qsort(a,2*m,sizeof(a[0]),comp);
for(i=2*m-1;i>=0;i--)
{
d[a[i].begin]=i;
}
for(i=0,p=0;i<n;i++)
{ clean(b,n,1000);
clean(c,n,0);
if(cheak(i)) {p=1;break;}
}
if(p) printf("No\n");
else printf("Yes\n");
}
return 0;
}