欧拉回路求助()
  • 板块学术版
  • 楼主南瓜桐
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/5/9 22:20
  • 上次更新2024/5/10 12:44:36
查看原帖
欧拉回路求助()
439327
南瓜桐楼主2024/5/9 22:20

https://loj.ac/p/10105
Orz

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 1, maxm = 4e5 + 1;
int t,n,m;
struct edge{
	int fr,to,nxt;
}e[maxm] = {};
int cnt_edge = 0, head[maxn] = {};
int in[maxn] = {}, out[maxn] = {}; 
bool vis[maxm] = {};
int st[maxm] = {}, top = 0;

void dfs(int u){
	for(int i = head[u]; i != -1; i = e[i].nxt){
		int v = e[i].to;
		if(!vis[i]){
			vis[i] = true;
			if(t == 1)vis[i^1] = true;
			dfs(v);
			st[++top] = i;
		}
	}
}
bool judge(){
	for(int i = 1; i <= n; ++i){
		if(t == 1){
			if(in[i] != out[i]) return false;
		}else{
			if(in[i] % 2 == 1) return false;
		}
	}
	return true;
} 
void add_edge(int u, int v){
	e[++cnt_edge] = (edge){u,v,head[u]};
	head[u] = cnt_edge;
}
void dfs(){
	
}
int main(){
	cin>>t>>n>>m;
	for(int i = 1; i <= n; ++i)head[i] = -1;
	for(int i = 1; i <= m; ++i){
		int u,v;
		cin>>u>>v;
		if(t == 1){
			add_edge(u,v); add_edge(v,u);
		}else{
			add_edge(u,v);
		}
		++out[u];
		++in[v];
	}
	if (judge()){
		for(int i = 1; i <= n; ++i){
			if(head[i] != -1){
				dfs(i);
				break;
			}
		}
	}else{
		cout<<"NO";
		return 0;
	}
	if(top != m){
		cout<<"NO";
		return 0;
	}
	cout<<"YES\n";
	for(int i = top; i >= 0; --i)cout<<st[i]<<' ';
	return 0;
}
2024/5/9 22:20
加载中...