codeforces724E Goods transportation(欧拉回路)
题意:
给你n个点m条无向边,不保证图联通,让你给每条边定向,使得图中入度=出度的节点数量最大
思路:
图中奇数度节点肯定是不行的,奇数度节点有偶数个,可以把他们都连到附加的n+1这个节点上转为偶数度
这样全部的节点都为偶数度,然后跑fleury就可以了,注意图的联通,有n+1节点的边不输出
这里存一个比较机制的做法。。
/* *********************************************** Author :devil ************************************************ */ #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <set> #include <stack> #include <map> #include <string> #include <time.h> #include <cmath> #include <stdlib.h> #define LL long long #define rep(i,a,b) for(int i=a;i<=b;i++) #define dep(i,a,b) for(int i=a;i>=b;i--) #define ou(a) printf("%d\n",a) #define pb push_back #define pii pair<int,int> #define mkp make_pair template<class T>inline void rd(T &x) { char c=getchar(); x=0; while(!isdigit(c))c=getchar(); while(isdigit(c)) { x=x*10+c-'0'; c=getchar(); } } #define IN freopen("in.txt","r",stdin); #define OUT freopen("out.txt","w",stdout); using namespace std; const int inf=0x3f3f3f3f; const int mod=1e9+7; const int N=2e2+10; int t,n,m,x,y; int du[N]; set<int>eg[N]; void dfs(int u) { while(eg[u].size()) { int v=*eg[u].begin(); eg[u].erase(v),eg[v].erase(u); if(u!=n+1&&v!=n+1) printf("%d %d\n",u,v); dfs(v); } } int main() { #ifndef ONLINE_JUDGE IN #endif scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(int i=1;i<=n+1;i++) eg[i].clear(),du[i]=0; while(m--) { scanf("%d%d",&x,&y); eg[x].insert(y); eg[y].insert(x); du[x]++; du[y]++; } int ans=0; for(int i=1;i<=n;i++) { if(du[i]&1) { ans++; eg[i].insert(n+1); eg[n+1].insert(i); } } printf("%d\n",n-ans); for(int i=1;i<=n;i++) dfs(i); } return 0; }