cf#161-D-Cycle in Graph- dfs

来源:互联网 发布:cms始源勇者王 编辑:程序博客网 时间:2024/05/22 17:11

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


0 0
原创粉丝点击