UOJ117 歐拉回路
阿新 • • 發佈:2021-11-18
一直找沒找到的邊即可
對於無解的情況
無向圖是存在出度為奇數的點。
有向圖是存在入度和出度不一樣的點
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