88pts WA 求助qwq
查看原帖
88pts WA 求助qwq
390770
S0CRiA楼主2021/10/17 16:48
#include <bits/stdc++.h>
using namespace std;

const int N = 1e6 + 10;
vector<int> Edge[N];
int n, m;

namespace solve1{
	int fa[N], isring[N], tmp = -1, cuttena = -1, cuttenb = -1;
	int gf(int x){ return fa[x] == x ? x : fa[x] = gf(fa[x]); }
	void cut(int x, int y){ cuttena = x, cuttenb = y; }
	bool getring(int x, int f, int g){
		if(x == g) return isring[x] = isring[g] = 1;
		for(int i = 0; i < Edge[x].size(); ++ i){
			int y = Edge[x][i]; if(y == f) continue;
			if(getring(y, x, g)) return isring[x] = 1;
		}
		return false;
	}
	void dfs(int x, int f){
		if(x == cuttena && f == cuttenb) return;
		if(x == cuttenb && f == cuttena) return;
		if(x) printf("%d ", x);
		if(isring[x]){
			if(tmp == -1){
				int a = -1;
				for(int i = 0; i < Edge[x].size(); ++ i){
					int y = Edge[x][i]; if(y == f) continue;
					if(isring[y] && a == -1) a = y;
					else if(isring[y]) tmp = y;
				}
				for(int i = 0; i < Edge[x].size(); ++ i){
					int y = Edge[x][i]; if(y == f) continue;
					dfs(y, x);
				}
			} else {
				for(int i = 0; i < Edge[x].size(); ++ i){
					int y = Edge[x][i]; if(y == f) continue;
					if(!isring[y] || (isring[y] && y <  tmp)) dfs(y, x);
					else cut(x, y), tmp = 0x3f3f3f3f;
				}
			}
		} else {
			for(int i = 0; i < Edge[x].size(); ++ i){
				int y = Edge[x][i]; if(y == f) continue;
				dfs(y, x);
			}
		}
	}
	void mian(){
		for(int i = 1; i <= n; ++ i) fa[i] = i;
		for(int i = 1, u, v, flg = 1; i <= m; ++ i){
			scanf("%d%d", &u, &v);
			Edge[u].push_back(v);
			Edge[v].push_back(u);
			if(gf(u) == gf(v)) getring(u, -1, v), flg = 0;
			if(flg) fa[gf(u)] = gf(v);
		}
		for(int i = 1; i <= n; ++ i)
			sort(Edge[i].begin(), Edge[i].end());
		dfs(1, -1);
	}
}

namespace solve2{
	void dfs(int x, int f){
		printf("%d ", x);
		for(int i = 0; i < Edge[x].size(); ++ i){
			int y = Edge[x][i]; if(y == f) continue;
			dfs(y, x);
		}
	}
	void mian(){
		for(int i = 1, u, v; i <= m; ++ i){
			scanf("%d%d", &u, &v);
			Edge[u].push_back(v);
			Edge[v].push_back(u);
		}
		for(int i = 1; i <= n; ++ i)
			sort(Edge[i].begin(), Edge[i].end());
		dfs(1, -1);
	}
}

int main(){
	scanf("%d%d", &n, &m);
	if(n == m) solve1::mian();
	else solve2::mian();
	return 0;
}
2021/10/17 16:48
加载中...