题意:给你一个无向图,使其变为有向,让入度==出度的点最多。
思路:
想通一个点:只有度数为偶数的点可以满足条件。想通这一点之后可以跟奇点建立一些虚边,跑欧拉回路。
代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define forn(i,n) for(int i=0;i<n;i++)
#define for1(i,n) for(int i=1;i<=n;i++)
#define IO ios::sync_with_stdio(false);cin.tie(0)
const int maxn = 205;
const int maxm = maxn*maxn;
int head[maxn],tot,deg[maxn];
struct edge{
int v,nex;
bool ok;
}e[maxm];
vector<pair<int,int> > res;
void init(int n){
forn(i,n+5) head[i] = -1,deg[i] = 0;
tot = 0;
res.clear();
}
void add(int u,int v){
e[tot] = {v,head[u],0};
head[u] = tot++;
}
void euler(int u){
for(int i = head[u];i!=-1;i = e[i].nex){
if(e[i].ok) continue;
int v = e[i].v;
e[i].ok = e[i^1].ok = 1;
euler(v);
res.push_back({u,v});
}
}
int main(){
IO;
int t;cin>>t;
while(t--){
int n,m;cin>>n>>m;
init(n);
forn(i,m){
int u,v;cin>>u>>v;
add(u,v),add(v,u);
deg[u]++,deg[v]++;
}
int ans = n;
for1(i,n) if(deg[i]&1) add(0,i),add(i,0),ans--;
for1(i,n) if(head[i]!=-1) euler(i);
cout<< ans <<'
';
reverse(res.begin(),res.end());
for(auto &x:res){
if(!x.first||!x.second) continue;
cout<<x.first<<' '<<x.second<<'
';
}
}
return 0;
}