给出N个点,M条无向边,保证现在每个点的度至少为K,让我们找到一个长度大于K+1的环。
思路:
直接Dfs即可,我们任意选择一个点进行Dfs,肯定会构成一个环出来,并且长度大于等于k+1。
Ac代码:
#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;
vector<int>mp[150000];
int Len[150000],ans[150000];
int n,m,k,cnt,ss,ee,ok;
void Dfs(int u)
{
if(ok==1)return ;
Len[u]=++cnt;
ans[cnt]=u;
for(int i=0;i<mp[u].size();i++)
{
int v=mp[u][i];
if(Len[v])
{
if(Len[u]-Len[v]+1>=k+1)
{
ok=1;
ss=v;
ee=u;
return ;
}
}
else Dfs(v);
}
}
int main()
{
while(~scanf("%d%d%d",&n,&m,&k))
{
ok=0;
cnt=0;
memset(Len,0,sizeof(Len));
for(int i=1;i<=m;i++)
{
int x,y;scanf("%d%d",&x,&y);
mp[x].push_back(y);
mp[y].push_back(x);
}
Dfs(1);
printf("%d\n",Len[ee]-Len[ss]+1);
for(int i=Len[ss];i<=Len[ee];i++)
{
printf("%d ",ans[i]);
}
printf("\n");
}
}