欧拉路径模板提60pts求助
  • 板块学术版
  • 楼主南瓜桐
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/10/21 21:42
  • 上次更新2024/10/22 00:16:57
查看原帖
欧拉路径模板提60pts求助
439327
南瓜桐楼主2024/10/21 21:42

rt , Orz
P7771

#include <bits/stdc++.h> 
using namespace std;
int n, m;
const int maxn = 1e5 + 1, maxm = 2e5 + 1;
vector<int> e[maxn];
int in_[maxn] = {}, out_[maxn] = {}, start[maxn] = {};
int min_ver = 1e9;
int st[maxn] = {}, top = 0;
bool judge(int &s){
	int cnt_start = 0, cnt_end = 0;
	bool flag = true;
	for(int i = 1; i <= n; ++i){
		if(in_[i] == out_[i]) continue;
		else if(in_[i] + 1 == out_[i]){
			s = i;
			flag = false;
			++cnt_start;
		}
		else if(in_[i] == out_[i] + 1){
			flag = false;
			++cnt_end;
			
		}
		else return false; 
	}
//	
	if(flag){
		s = min_ver;
		return true;
	}else{
		
		if(cnt_end == 1 && cnt_start == 1) return true;
		else return false;
	}
}
void dfs(int u){
	for(int i = start[u]; i < e[u].size();i = start[u]){
		++start[u];
		dfs(e[u][i]);
	}
	st[++top] = u;

}
int main(){
//	freopen("P7771_7.in", "r", stdin);
	cin >> n >> m;
	
	for(int i = 1; i <= m; ++i){
		int u, v;
		scanf("%d%d", &u, &v);
		e[u].push_back(v);
		++in_[v];
		++out_[u];
		min_ver = min(min_ver, min(v, u));
	}
	for(int i = 1; i <= n; ++i) sort(e[i].begin(), e[i].end());
	
	int s = min_ver;
	if(!judge(s)){
        cout << "No";
	}        return 0;

//	printf("s:%d\n", s);
//	s = 1;
	dfs(s);
	for(int i = top; i >= 1; --i) printf("%d ", st[i]);
	return 0;
}
2024/10/21 21:42
加载中...