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

 

posted @ 2020-07-19 23:14  朝暮不思  阅读(214)  评论(0编辑  收藏  举报