题目链接: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; }