题目链接:Codeforces - One-Way Reform
由于欧拉回路的特性,我们可以发现,答案就是度数为偶数的点。
为奇数的点怎么办呢?由于度数为奇数的点一定是偶数,所以我们可以加一个虚拟节点,使得图为存在欧拉回路的图。然后跑欧拉回路即可。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=210,M=1e5+10;
int n,m,dag[N],cnt;
unordered_set<int> g[N];
vector<pair<int,int> > res;
inline void add(int a,int b){
g[a].insert(b),g[b].insert(a); dag[a]++,dag[b]++;
}
void dfs(int x){
while(g[x].size()){
int to=*g[x].begin();
g[x].erase(to),g[to].erase(x);
if(x&&to) res.push_back({x,to});
dfs(to);
}
}
inline void init(){
memset(dag,0,sizeof dag); res.clear(); cnt=0;
}
inline void solve(){
cin>>n>>m; init();
for(int i=1,x,y;i<=m;i++) cin>>x>>y,add(x,y);
for(int i=1;i<=n;i++) if(dag[i]&1) add(0,i),cnt++;
for(int i=1;i<=n;i++) dfs(i);
cout<<n-cnt<<'\n';
for(int i=0;i<res.size();i++) cout<<res[i].first<<' '<<res[i].second<<'\n';
}
signed main(){
int T; cin>>T;
while(T--) solve();
return 0;
}
来源:CSDN
作者:青烟绕指柔!
链接:https://blog.csdn.net/weixin_43826249/article/details/104167684