‘题意:给出一个无向图,问是否存在闭环其长度为k;
思路:对每个点dfs,开一个一个数组记录搜索到的点的深度,搜索到以搜索过的点时检查与当前的深度差是否为k
本来写了一堆返回及恢复的东西,结果并没有什么卵用,唉,好难理解啊
#include<iostream>
#include<stdio.h>
#include<cstring>
using namespace std;
int n,m,k,flag;
int a[55][55];
int vis[55];
void dfs(int num,int ans,int pre)
{
if(vis[num])
{
if(ans-vis[num]==k)
flag=1;
return ;
}
if(flag) return;
vis[num]=ans;
for(int i=0;i<n;i++)
{
if(a[num][i]&&i!=pre)
{
dfs(i,ans+1,num);
}
//if(!flag)
// {
//vis[num]=0;
// return 0;
// }
//else
// return 1;
}
//vis[num]=0;
//return ;
}
int main()
{
//freopen("in.txt","r",stdin);
int t;
scanf("%d",&t);
while(t--)
{
memset(a,0,sizeof(a));
scanf("%d%d%d",&n,&m,&k);
int x,y;
for(int i=0;i<m;i++)
{
scanf("%d%d",&x,&y);
a[x][y]=1;
a[y][x]=1;
}
flag=0;
for(int i=0;i<n;i++)
{
memset(vis,0,sizeof(vis));
dfs(i,1,-1);
if(flag)break;
}
if(flag)
printf("YES\n");
else
printf("NO\n");
}
}