题目链接:https://codeforces.ml/contest/723/problem/E
描述:
给出一个无向图,确定边的方向,是入度等于出度的点最多。
分析:
有一个重要的定理:一个无向图度数为奇数的点必有偶数个。
所有度数为偶数的点均可以满足出度等于入度。
所以可以将所有度数是奇数的点连向虚点n+1,这样新建的图满足欧拉回路,跑一边欧拉回路,便可得到边的方向。输出时与0相连的边注意删掉。
#include<bits/stdc++.h>
#define N 210
#define ll long long
#define pii pair<int,int>
using namespace std;
vector<pair<int,int> >ans;
vector<int>v[N];
int n,d[N],m,vis[N][N];
void dfs(int x){
for(int i=0;i<v[x].size();i++){
int to=v[x][i];
if(!vis[to][x]){
vis[to][x]=1;vis[x][to]=1;
dfs(to);
ans.push_back(make_pair(x,to));
}
}
}
int main(){
int qt;
scanf("%d",&qt);
while(qt--){
scanf("%d%d",&n,&m);
int x,y;
for(int i=1;i<=n+1;i++)d[i]=0,v[i].clear();
for(int i=1;i<=m;i++){
scanf("%d%d",&x,&y);
v[x].push_back(y);
v[y].push_back(x);
d[x]++;d[y]++;
}
ans.clear();
for(int i=1;i<=n+1;i++)
for(int j=1;j<=n+1;j++)vis[i][j]=0;
int t=0;
for(int i=1;i<=n;i++){
if(d[i]%2==1){
v[n+1].push_back(i);
v[i].push_back(n+1);
t++;
}
}
printf("%d\n",n-t);
for(int i=1;i<=n;i++)dfs(i);
for(int i=0;i<ans.size();i++){
if(ans[i].first!=n+1&&ans[i].second!=n+1)printf("%d %d\n",ans[i].first,ans[i].second);
}
}
return 0;
}