cf#161-D-Cycle in Graph- dfs

49 篇文章 1 订阅
13 篇文章 0 订阅

题意:给一个无向图,存在环,保证每个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;
		
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值