求助 #17#18#22#23#25WA,#19TLE
查看原帖
求助 #17#18#22#23#25WA,#19TLE
678858
ShiRoZeTsuHL卜奎BBQ!楼主2022/10/12 22:57
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
#define _sch(u) for(int _ = 0, v = e[u][_], sze = e[u].size(); _ < sze; _++, v = e[u][_])
#define pbk push_back
const int maxn = 5e3 + 5;
int n, m, cut1, cut2, hcen, h1, h2;
bool vis[maxn];
vector<int> e[maxn];

void treedfs(int u, int fa) {
	printf("%d ", u);
	_sch(u) if(v != fa) treedfs(v, u);
}

void dfs(int u, int fa) {
	vis[u] = true;
	_sch(u) {
		if(vis[v]) {
			hcen = v, h2 = u;
			return;
		}
		if(v != fa) dfs(v, u);
		if(hcen == u) h1 = v;
		if(hcen) return;
	}
}

bool del(int u, int fa) {
	_sch(u) {
		if(v == fa) continue;
		if(v == hcen) return true;
		if(del(v, u)) {
			if(u > h2) cut1 = fa, cut2 = u;
			return true;
		}
	}
	return false;
}

int main() {
	scanf("%d %d", &n, &m);
	for(int i = 1, u, v; i <= m; i++) {
		scanf("%d %d", &u, &v);
		e[u].pbk(v); e[v].pbk(u);
	}
	for(int i = 1; i <= n; i++)
		sort(e[i].begin(), e[i].end());
	if(m == n-1) treedfs(1, 0);
	else {
		dfs(1, 0);
		cut1 = h2, cut2 = hcen;
		del(h1, hcen);
		int sze = e[cut1].size();
		for(int i = 0; i < sze; i++)
			if(e[cut1][i] == cut2) {
//				printf("%d\n", *(e[cut1].begin()+i));
				e[cut1].erase(i + e[cut1].begin());
			}
		sze = e[cut2].size();
		for(int i = 0; i < sze; i++)
			if(e[cut2][i] == cut1) {
//				printf("%d\n", *(e[cut2].begin()+i));
				e[cut2].erase(i + e[cut2].begin());
			}
		treedfs(1, 0);
	}
	return 0;
}
2022/10/12 22:57
加载中...