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; }
没有人不辛苦,只有人不喊疼