UOJ117 欧拉回路

一直找没找到的边即可

对于无解的情况
无向图是存在出度为奇数的点。
有向图是存在入度和出度不一样的点

const int N = 1e5 + 79;
const int M = 2e5 + 79;
int t, n, m, ot[N], in[N], vis[M << 1];
std::vector<int>g;
struct graph {
	int head[M << 1], tot = 1, next[M << 1], ver[M << 1];
	inline void add(int a, int b) {
		ver[++tot] = b;
		next[tot] = head[a];
		head[a] = tot;
	}
} G;

inline void dfs(int x){
	int now;
	for(int &i(G.head[x]);i;i=G.next[i]){
		int y(G.ver[i]);
		if(!vis[i/2]){
			vis[i/2]=1;
			now=i;
			dfs(y);
			g.push_back(now);
		}
	}
}

int main() {
	read(t);//1 <->   2 ->
	read(n);
	read(m);
	if(!m) {
		puts("YES");
		return 0;
	}

	int x, y;
	rep(i, 1, m) {
		read(x);
		read(y);
		if(t == 1) {
			G.add(x, y);
			G.add(y, x);
			++ot[x];
			++ot[y];
			++in[x];
			++in[y];
		} else {
			G.add(x, y);
			++ot[x];
			++in[y];
			++G.tot;
		}
	}
	//ÅжÏÎÞ½â
	if(t ==1) {
		rep(i, 1, n) {
			if(ot[i]%2) {
				puts("NO");
				return 0;
			}
		}
	} else {
		rep(i, 1, n) {
			if(ot[i]!=in[i]) {
				puts("NO");
				return 0;
			}
		}
	}
	int s;
	rep(i, 1, n) {
		if(in[i]||ot[i]) {
			s = i;
			break;
		}
	}
	
	dfs(s);
	if(g.size() != m) {
		puts("NO");
	} else {
		puts("YES");
		int t(g.size()-1);
		drp(i,t,0){
			s=g[i]/2;
			if(g[i]%2) s*=-1;
			out(s,' ');
		}
	}
	return 0;
}

本文来自博客园,作者:{2519},转载请注明原文链接:https://www.cnblogs.com/QQ2519/p/15573158.html

原文地址:https://www.cnblogs.com/QQ2519/p/15573158.html