96PTS WA on 16#求助
查看原帖
96PTS WA on 16#求助
552608
Ask_sum楼主2024/7/13 10:29

rt,调了很久不知道哪里错了,写的很依托,求 dalao看看(

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 5e5 + 10;
int n, m, vis[MAXN], u, v, edcnt, ring[MAXN], tot, fg, fa[MAXN], tmp[MAXN], pd[MAXN], mx[MAXN], subt1[MAXN], subt2[MAXN], ed[MAXN];
vector <int> t[MAXN], rt[MAXN];
void dfs1(int u, int f){
	if(fg)return;
	vis[u] = 1;
	fa[u] = f;
	int len = t[u].size();
	for(int i = 0; i < len && !fg; i++){
		if(fg)return;
		int v = t[u][i];
		if(v == f)continue;
		if(vis[v]){
			ring[++tot] = v;
			pd[v] = 1;
			while(u != v){
				pd[u] = 1;
				ring[++tot] = u;
				u = fa[u];
			}
			fg = 1;
			return;
		}
		dfs1(v, u);	
	}
}
void dfs2(int u, int f, int x, int y){
	ed[++edcnt] = u;
	int len = t[u].size();
	for(int i = 0; i < len; i++){
		int v = t[u][i];
		if(v == f || (u == x && v == y) || (u == y && v == x))
			continue;
		dfs2(v, u, x, y);
	}
}
int main(){
//	freopen("travelsss.txt", "w", stdout);
	scanf("%d %d", &n, &m);
	for(int i = 1; i <= m; i++){
		int u, v;
		scanf("%d %d", &u, &v);
		t[u].push_back(v);
		t[v].push_back(u);
	}
	dfs1(1, 0);
	for(int i = 1; i <= n; i++)
		sort(t[i].begin(), t[i].end());
	int j;
	ring[++tot] = ring[1];
	for(int i = 1; i <= tot; i++)
		tmp[i] = ring[tot - i + 1];
	for(int i = 1; i <= tot; i++)
		ring[i] = tmp[i];// cout << ring[i] << ' ';
//	puts("");
	for(int i = 2; i < tot; i++){
		int len = t[ring[i]].size();
		for(int j = 0; j < len; j++){
			int v = t[ring[i]][j];
			if(v == fa[ring[i]] || pd[v])
				continue;
			rt[i].push_back(v);
			mx[i] = max(mx[i], v);
		}
//		cout << ring[i] << ':' << mx[i] << ' ';
		sort(rt[i].begin(), rt[i].end());
	}
//	puts("");
	for(int i = 3; i < tot; i++){	
		if(t[ring[i - 1]].size() > 2)
			subt1[i] = i - 1;
		else
			subt1[i] = subt1[i - 1];
	}
	if(t[ring[1]].size() > 3)
		subt1[2] = subt2[tot - 1] = 1;
	for(int i = tot - 2; i >= 2; i--){
		if(t[ring[i + 1]].size() > 2)
			subt2[i] = i + 1;
		else
			subt2[i] = subt2[i + 1];
	}
	
	if(ring[2] > ring[tot - 1]){
		for(j = tot - 1; j > 2; j--){
			int nxt = ring[j - 1];
//			cout << nxt << ' ' << mx[j] << '\n';
			if(nxt < mx[j] || nxt < ring[2])
				continue;
			if(subt2[j]){
				int ct = lower_bound(rt[subt2[j]].begin(), rt[subt2[j]].end(), nxt) - rt[subt2[j]].begin();
				if(ct == rt[subt2[j]].size()){
					u = ring[j], v = ring[j - 1];
					break;
				}
				continue;
			}
			u = ring[j];
			v = ring[j - 1];
			break;
		}
		if(!u)
			u = ring[2], v = ring[1];
	}	
	else{
		for(j = 2; j < tot - 1; j++){
			int nxt = ring[j + 1];
//			cout << nxt << ' ' << mx[j] << '\n';
			if(nxt < mx[j] || nxt < ring[tot - 1])
				continue;
			if(subt1[j]){
				int ct = lower_bound(rt[subt1[j]].begin(), rt[subt1[j]].end(), nxt) - rt[subt1[j]].begin();
				if(ct == rt[subt1[j]].size()){
					u = ring[j], v = ring[j + 1];
					break;
				}
				continue;
			}
			u = ring[j];
			v = ring[j + 1];
			break;
		}
		if(!u)
			u = ring[tot - 1], v = ring[1];
	}
//	return 0;
	if(m == n - 1)
		dfs2(1, 0, 0, 0);
	else dfs2(1, 0, u, v);
	for(int i = 1; i <= n; i++)
		printf("%d ", ed[i]);
	return 0;
}
2024/7/13 10:29
加载中...