Codeforces 263D Cycle in Graph【Dfs】

来源:互联网 发布:淘宝的售后服务是什么 编辑:程序博客网 时间:2024/05/22 12:47

D. Cycle in Graph
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

You've got a undirected graph G, consisting of n nodes. We will consider the nodes of the graph indexed by integers from 1 to n. We know that each node of graph G is connected by edges with at least k other nodes of this graph. Your task is to find in the given graph a simple cycle of length of at least k + 1.

simple cycle of length d (d > 1) in graph G is a sequence of distinct graph nodes v1, v2, ..., vd such, that nodes v1 and vd are connected by an edge of the graph, also for any integer i (1 ≤ i < d) nodes vi and vi + 1 are connected by an edge of the graph.

Input

The first line contains three integers nmk (3 ≤ n, m ≤ 105; 2 ≤ k ≤ n - 1) — the number of the nodes of the graph, the number of the graph's edges and the lower limit on the degree of the graph node. Next m lines contain pairs of integers. The i-th line contains integers aibi (1 ≤ ai, bi ≤ nai ≠ bi) — the indexes of the graph nodes that are connected by the i-th edge.

It is guaranteed that the given graph doesn't contain any multiple edges or self-loops. It is guaranteed that each node of the graph is connected by the edges with at least k other nodes of the graph.

Output

In the first line print integer r (r ≥ k + 1) — the length of the found cycle. In the next line print r distinct integers v1, v2, ..., vr (1 ≤ vi ≤ n)— the found simple cycle.

It is guaranteed that the answer exists. If there are multiple correct answers, you are allowed to print any of them.

Examples
input
3 3 21 22 33 1
output
31 2 3 
input
4 6 34 31 21 31 42 32 4
output
43 4 1 2 

题目大意:


给出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");    }}










阅读全文
0 0