一直找没找到的边即可
对于无解的情况
无向图是存在出度为奇数的点。
有向图是存在入度和出度不一样的点
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;
}