题意:给一个无向图,存在环,保证每个node至少与k个点相连,让你找出一个 长度》k+1的环。。。
把1作为根,dfs搜,当遇到一个没访问过的节点V则递归进入,否则判断该节点是否是直接父亲,如果不是的话,说明存在一个环,X到V,因为每次往下走的都是没访问过的节点,所以X到V这条链上的点都是在同一分支,因此换的长度就是dp[v]-dp[x]+1,如果大于k+1直接输出答案,否则继续搜索、
本来挺简单的题, 结果我想到了一个 环不在同一分支的情况(是不存在这种情况的)。。一直在处理这个情况。。。这种情况下要输出所有的点还得再搜。。。总之自己给自己找麻烦。。。。
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iostream>
using namespace std;
const double pi=acos(-1.0);
double eps=0.000001;
int dp[100005];
__int64 min(__int64 a,__int64 b)
{return a<b?a:b;}
__int64 max(__int64 a,__int64 b)
{return a>b?a:b;}
int n,m,k;
vector<int > mp[100005];
int vis[100005];
int flag=0;
int ans[100005];
int ok=0;
int cun=0;
int tmp[100005];
void dfs(int x,int cur)
{
vis[x]=1;
dp[x]=cur;
int i;
for (i=0;i<mp[x].size();i++)
{
int v=mp[x][i];
if (vis[v])
{
if (v==fa[x]) continue;
else
{
int len=cur-dp[v]+1;
if (len>=k+1)
{
while(tmp[ok]!=v)
{
ans[++cun]=tmp[ok];
ok--;
}
ans[++cun]=tmp[ok];
flag=1;return ;
}
}
continue;
}
tmp[++ok]=v;
dfs(v,cur+1);
if (flag) return ;
ok--;
}
}
int main()
{
int x,y,i,j;
cin>>n>>m>>k;
for (i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
mp[x].push_back(y);
mp[y].push_back(x);
}
tmp[++ok]=1;
dfs(1,1);
printf("%d\n",cun);
for (i=cun;i>=1;i--)
{
if (i!=cun) printf(" ");
printf("%d",ans[i]);
}
printf("\n");
return 0;
}