MnZn 求助 76 分
查看原帖
MnZn 求助 76 分
253608
Tx_Lcy楼主2022/9/22 17:00

RT,思路就是走到一个环,分两种情况,走左边就记录下右边,当走到某一个位置比右边的值大则跳到右边。

#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;
int const N=1e6+10;int v[N],s[N],tag=0,top,vis[N],co[N],ans[N],k;
vector<int>a[N];int la=-1;
inline void findhuan(int x,int fa){
	s[++top]=x;vis[x]=1;
	if (tag) return;
	for (auto v:a[x]){
		if (tag) return;
		if (v!=fa){
			if (vis[v]){
				int k=top;
				while (1){
					int X=s[k];co[s[k--]]=1;
					if (k<0) break;
					// cout<<k<<' '<<X<<' '<<v<<'\n';
					if (X==v){tag=1;return;}
				}
			}else findhuan(v,x);
		}
	}
	top--;
}
inline void dfs(int x){
	ans[++k]=x;vis[x]=1;
	// cout<<x<<'\n';
	sort(a[x].begin(),a[x].end());
	// cout<<a[x].size()<<'\n';
	int st=0;while (st<a[x].size() && vis[a[x][st]]) ++st;//,cout<<st<<'\n';
	// --st;if (st<0) ++st;
	if (st==a[x].size()) return;
	// cout<<x<<' '<<st<<' '<<a[x][st]<<' '<<co[x]<<'\n';
	if (co[x] && la!=-1 && la<a[x][st] && !vis[la]) dfs(la);
	if (co[x] && la==-1){
		int tag=0;
		for (auto v:a[x]){if (co[v]){tag=v;break;}}
		for (auto v:a[x]) if (co[v] && v!=tag) la=v;
	}
	for (auto v:a[x]) if (!vis[v]) dfs(v);
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
    int n,m;cin>>n>>m;
    while (m--){
    	int u,v;cin>>u>>v;
    	a[u].push_back(v);a[v].push_back(u);
    }
    findhuan(1,-1);
    memset(vis,0,sizeof(vis));
    // cout<<"1\n";
    // for (int i=1;i<=n;++i) cout<<co[i]<<' ';
    // cout<<'\n';
    dfs(1);
    for (int i=1;i<=n;++i) cout<<ans[i]<<' ';
    cout<<'\n';
	return 0;
}
2022/9/22 17:00
加载中...