发情了!88pts MLE+TLE 球跳
查看原帖
发情了!88pts MLE+TLE 球跳
691641
Grow_楼主2025/1/13 14:40

RT

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,u,v,net[500005],lst[500005],lt;
vector<int>vt[500005];
bool vs[500005],vis[500005],ed;
stack<int>st;
void dfs1(int x,int fa){
	cout << x << " ";
	for(int i:vt[x]){
		if(i==fa||(u==x&&v==i)||(u==i&&v==x))continue;
		dfs1(i,x);
	}
	return;
}
int hh;
void zh(int x,int fa){
	st.push(x);
	vs[x] = 1;
	for(int i:vt[x]){
		if(i==fa)continue;
		if(vs[i]){
			while(!st.empty()&&st.top()!=i){
				vis[st.top()] = 1;
				net[lt] = st.top();
				lt = st.top();
				st.pop();
			}
			net[lt] = i;
			net[i] = x;
			vis[i] = 1;
			hh = i;
			ed = 1;
			return;
		}
		zh(i,x);
		if(ed)return;
	}
	st.pop();
	return;
}
bool b = 1;
void dfs(int x,int fa){
	if(u)return;
	if(vis[x]){
		bool f = 0;
		for(int i:vt[x]){
			if(i==fa||i==lst[x]||i==net[x])continue;
			if(fa==lst[x]){
				if(i<net[x]||f)dfs(i,x);
				else{
					lt = i;
					dfs(net[x],x);
					dfs(i,x);
					f = 1;
				}
			}
			else if(fa==net[x]){
				if(i<lst[x]||f)dfs(i,x);
				else{
					lt = i;
					dfs(lst[x],x);
					dfs(i,x);
					f = 1;
				}
			}
			else{
				if(i<min(lst[x],net[x])||f)dfs(i,x);
				else{
					f = 1;
					if(lst[x]<net[x]){
						lt = min(i,net[x]);
						dfs(lst[x],x);
					}
					else{
						lt = min(i,lst[x]);
						dfs(net[x],x);
					}
					dfs(i,x);
				}
			}
		}
		if(!f){
			if(fa==lst[x]){
				if(lt<net[x]){
					u = x;
					v = net[x];
					return;
				}
				else dfs(net[x],x);
			}
			else if(fa==net[x]){
				if(lt<lst[x]){
					u = x;
					v = lst[x];
					return;
				}
				else dfs(lst[x],x);
			}
			else{
				if(net[x]<lst[x]){
					lt = lst[x];
					dfs(net[x],x);
					dfs(lst[x],x);
				}
				else{
					lt = net[x];
					dfs(lst[x],x);
					dfs(net[x],x);
				}
			}
		}
	}
	else{
		for(int i:vt[x]){
			if(i==fa)continue;
			dfs(i,x);
		}
	}
	return;
}
signed main(){
//	freopen("hack.in","r",stdin);
//	freopen("ans.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> m;
	for(int i = 1;i<=m;i++){
		cin >> u >> v;
		vt[u].push_back(v);
		vt[v].push_back(u);
	}
	for(int i = 1;i<=n;i++)sort(vt[i].begin(),vt[i].end());
	u = v = 0;
	if(m==n-1)dfs1(1,0);
	else{
		zh(1,0);
		for(int i = 1;i<=n;i++)if(vis[i])lst[net[i]] = i;
		lt = 0;
		memset(vs,0,sizeof(0));
		dfs(1,0);
		if(u==0&&v==0)u = hh,v = net[hh];
		memset(vs,0,sizeof(0));
		dfs1(1,0);
	}
    return 0;
}
2025/1/13 14:40
加载中...