有一张无向连通图,添加若干条边使图存在欧拉回路。输出任意一种方案。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5e5+7;
struct Edge{
int u,v,nxt;
Edge(int u=0,int v=0,int nxt=0):u(u),v(v),nxt(nxt){}
}e[N*2];
bool tr[N*2];
int p[N],edn;
void add(int u,int v){
e[++edn]=Edge(u,v,p[u]);p[u]=edn;
e[++edn]=Edge(v,u,p[v]);p[v]=edn;
}
int n,m,k,u,v;
int d[N],ds[N],dt[N],vis[N];
int f[N];
int fd(int x){return x==f[x]?x:f[x]=fd(f[x]);}
void un(int x,int y){
int fx=fd(x),fy=fd(y);
if(fx==fy) return;
f[fx]=fy;
ds[fy]+=ds[fx];
}
vector<int>ans;
void dfs(int u){
dt[u]=d[u];
vis[u]=1;
for(int i=p[u];~i;i=e[i].nxt){
int v=e[i].v;
if(vis[v]) continue;
dfs(v);
if(dt[v]&1){
dt[u]+=dt[v];
ans.push_back(i/2*2);
}
}
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=m;i++){
scanf("%d%d",&u,&v);
d[u]=d[u]^1,d[v]=d[v]^1;
}
for(int i=1;i<=n;i++) f[i]=i,ds[i]=d[i];
memset(p,-1,sizeof(p));edn=-1;
for(int i=1;i<=k;i++){
scanf("%d%d",&u,&v);
un(u,v);
add(u,v);
}
for(int i=1;i<=n;i++){
if(fd(i)!=i) continue;
if(ds[i]&1){
printf("NO\n");
return 0;
}
dfs(i);
}
int sz=ans.size();
printf("YES\n%d\n",sz);
for(int i=0;i<sz;i++)
printf("%d %d\n",e[ans[i]].u,e[ans[i]].v);
}