给你一个无向图。
要求加最少的边,然后给这些无向图的边定向,使得每一个点的出入度都是偶数。
输出定向后的边数和边集。
n<=10^5,m<=2*10^5n<=105,m<=2∗105
思路:
先添加边,让图可以跑欧拉回路,就是让所有点的度数为偶数,
然后跑一次欧拉回路,记录一下路径,然后输出来就可以了 。
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+100;
int rt[N],n,m;
vector<int>f[N];
stack<int>st;
multiset<int>s[N];
void dfs(int u){
while(!s[u].empty()){
int it = *(s[u].begin());
s[u].erase(s[u].begin());
s[it].erase(s[it].find(u));
dfs(it);
}
st.push(u);
}
int main(){
int x,y;
scanf("%d%d",&n,&m);
for (int i = 0; i < m; ++i){
scanf("%d%d",&x,&y);
rt[x]++; rt[y]++;
s[x].insert(y); s[y].insert(x);
}
x = 0;
for (int i = 1; i <= n; ++i){
if (rt[i]&1) {
if (!x) x = i;
else{
rt[x]++; rt[i]++;
s[x].insert(i); s[i].insert(x);
x = 0;
}
}
}
dfs(1);
int tmp = st.size();
if (tmp & 1) printf("%d\n",tmp-1); else printf("%d\n",tmp);
x = st.top(); st.pop();
y = 0;
while(!st.empty()){
if ((y++) & 1) printf("%d %d\n",st.top(),x); else printf("%d %d\n",x,st.top());
x = st.top();
st.pop();
}
if ((tmp&1) == 0) printf("%d %d\n",x,x);
return 0;
}