zoukankan      html  css  js  c++  java
  • CF1364D Ehab's Last Corollary(dfs树)

    同样是找dfs树,这题如果本身就是树,那么直接奇偶找大的遍历

    如果是图,建立dfs树,如果全部的环都是>=k的,这样只需要找到一个环,之后隔着输出就是答案,因为这样总是能找到(k+1)/2

    不然的话直接把环输出就行

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N=5e5+10;
    int h[N],ne[N],e[N],idx;
    void add(int a,int b){
        e[idx]=b,ne[idx]=h[a],h[a]=idx++;
    }
    int n,m,lim;
    stack<int> q;
    int depth[N];
    int tag[N];
    int k;
    void dfs(int u,int now,int fa){
        depth[u]=now;
        int i;
        for(i=h[u];i!=-1;i=ne[i]){
            int j=e[i];
            if(j==fa)
                continue;
            dfs(j,now+1,u);
        }
    }
    vector<int> num;
    int sign=1;
    void dfs1(int u,int now,int fa){
        depth[u]=now;
        q.push(u);
        int i;
        for(i=h[u];i!=-1;i=ne[i]){
            int j=e[i];
            if(j==fa)
                continue;
            if(!depth[j]){
                dfs1(j,now+1,u);
            }
            else{
                if((depth[u]-depth[j]+1<=k)&&depth[u]>depth[j]){
                    cout<<2<<endl;
                    cout<<depth[u]-depth[j]+1<<endl;
                    for(int l=depth[u]-depth[j]+1;l>=1;l--){
                        int t=q.top();
                        q.pop();
                        cout<<t<<" ";
                    }
                    cout<<endl;
                    exit(0);
                }
                else{
                    stack<int> s;
                    if(sign){
                        for(int l=depth[u]-depth[j]+1;l>=1;l--){
                            int t=q.top();
                            s.push(t);
                            q.pop();
                            num.push_back(t);
                        }
                        while(s.size()){
                            int t=s.top();
                            s.pop();
                            q.push(t);
                        }
                        sign=0;
                    }
                }
            }
        }
        q.pop();
    }
    int main(){
        ios::sync_with_stdio(false);
        cin>>n>>m>>k;
        memset(h,-1,sizeof h);
        int x=m;
        while(m--){
            int a,b;
            cin>>a>>b;
            add(a,b);
            add(b,a);
        }
        if(n==x+1){
            dfs(1,1,-1);
            cout<<1<<endl;
            int cnt=0;
            for(int i=1;i<=n;i++){
                if(depth[i]%2){
                    cnt++;
                }
            }
            if(cnt>=n-cnt){
                cnt=0;
                for(int i=1;i<=n;i++){
                    if(depth[i]%2){
                        cnt++;
                        cout<<i<<" ";
                    }
                    if(cnt==(k+1)/2)
                        break;
                }
                cout<<endl;
            }
            else{
                cnt=0;
                for(int i=1;i<=n;i++){
                    if(depth[i]%2==0){
                        cnt++;
                        cout<<i<<" ";
                    }
                    if(cnt==(k+1)/2)
                        break;
                }
                cout<<endl;
            }
        }
        else{
            dfs1(1,1,-1);
            cout<<1<<endl;
            int cnt=1;
            int x=0;
            for(int i=0;i<num.size();i++){
                if(cnt%2){
                    x++;
                    cout<<num[i]<<" ";
                }
                cnt++;
                if(x==(k+1)/2)
                    break;
            }
        }
        return 0;
    }
    View Code
    没有人不辛苦,只有人不喊疼
  • 相关阅读:
    【Python入门自学笔记专辑】——面向对象编程-实例方法11.3.6
    最简单的轮播广告(原生JS)
    (转)JavaScript一:为什么学习JavaScript?
    JAVASCRIPT中经典面试题
    使用AngularJS实现简单:全选和取消全选功能
    canvas绘制经典折线图(一)
    前端总结
    PHP如何连接MySQL数据库
    PHP预定义变量
    PHP语法
  • 原文地址:https://www.cnblogs.com/ctyakwf/p/13341963.html
Copyright © 2011-2022 走看看