Codeforces 723E One-Way Reform(欧拉回路)
2016-10-05 10:06
459 查看
给你n点m边的图,然后让你确定每条边的方向,使得入度=出度的点最多
猜想所有偶数度数的点都能做到入度=出度
如何确定方向呢,考虑到里面奇数度数的点一定是偶数个
假设他们是v1,v2....,v2k
把v1与v2,v3与v4....v2k−1与v2k连边
这样所有点都是偶数度数,对于每个连通块存在欧拉回路
然后从每个点开始dfs就行了,走过的边就记录方向,然后标记不能走
碰到是新加的边,就不放进答案
代码:
猜想所有偶数度数的点都能做到入度=出度
如何确定方向呢,考虑到里面奇数度数的点一定是偶数个
假设他们是v1,v2....,v2k
把v1与v2,v3与v4....v2k−1与v2k连边
这样所有点都是偶数度数,对于每个连通块存在欧拉回路
然后从每个点开始dfs就行了,走过的边就记录方向,然后标记不能走
碰到是新加的边,就不放进答案
代码:
#include <map> #include <set> #include <stack> #include <queue> #include <cmath> #include <string> #include <vector> #include <cstdio> #include <cctype> #include <cstring> #include <sstream> #include <cstdlib> #include <iostream> #include <algorithm> #pragma comment(linker,"/STACK:102400000,102400000") using namespace std; #define MAX 210 #define MAXN 1000005 #define maxnode 5 #define sigma_size 30 #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define lrt rt<<1 #define rrt rt<<1|1 #define middle int m=(r+l)>>1 #define LL long long #define ull unsigned long long #define mem(x,v) memset(x,v,sizeof(x)) #define lowbit(x) (x&-x) #define pii pair<int,int> #define bits(a) __builtin_popcount(a) #define mk make_pair #define limit 10000 //const int prime = 999983; const int INF = 0x3f3f3f3f; const LL INFF = 0x3f3f; //const double PI = acos(-1.0); const double inf = 1e18; const double eps = 1e-6; const LL mod = 1e9+7; const ull mx = 133333331; /*****************************************************/ inline void RI(int &x) { char c; while((c=getchar())<'0' || c>'9'); x=c-'0'; while((c=getchar())>='0' && c<='9') x=(x<<3)+(x<<1)+c-'0'; } /*****************************************************/ struct Edge{ int v,next,c; }edge[MAX*MAX*2]; int head[MAX]; int deg[MAX]; int tot; vector<pii> ans; void init(){ mem(head,-1); mem(deg,0); tot=0; } void add_edge(int a,int b,int c){ edge[tot]=(Edge){b,head[a],c}; head[a]=tot++; } void dfs(int u){ for(int i=head[u];i!=-1;i=edge[i].next){ int v=edge[i].v; if(edge[i].c==-1) continue; if(edge[i].c==0) ans.push_back(mk(u,v)); edge[i].c=edge[i^1].c=-1; dfs(v); } } int main(){ //freopen("in.txt","r",stdin); int t; cin>>t; while(t--){ int n,m; cin>>n>>m; init(); for(int i=0;i<m;i++){ int a,b; scanf("%d%d",&a,&b); add_edge(a,b,0); add_edge(b,a,0); deg[a]++; deg[b]++; } vector<int> v; int cnt=0; for(int i=1;i<=n;i++){ if(deg[i]%2) v.push_back(i); else cnt++; } for(int i=0;i<v.size();i+=2){ int a=v[i]; int b=v[i+1]; add_edge(a,b,1); add_edge(b,a,1); } ans.clear(); for(int i=1;i<=n;i++) dfs(i); cout<<cnt<<endl; for(int i=0;i<ans.size();i++){ cout<<ans[i].first<<" "<<ans[i].second<<endl; } } return 0; }
相关文章推荐
- codeforces 723e One-Way Reform (欧拉回路) || 欧拉回路路径输出模板
- codeforces #375(div.2) 723E One-Way Reform 欧拉回路或网络流
- CodeForces 723E -One-Way Reform 构造+ 欧拉回路
- codeforces 723E. One-Way Reform(欧拉回路||网络流)
- CodeForces 723E One-Way Reform
- [欧拉回路 构造 || 网络流] Codeforces 723E #375 (Div. 2) E. One-Way Reform
- cf 723E One-Way Reform(欧拉回路)
- Codeforces Round #375 (Div. 2) -- E. One-Way Reform(dfs求欧拉回路)
- [欧拉回路] Codeforces 429E #245 (Div. 1) E. Points and Segments
- CodeForces 788B 浅谈并查集维护奇妙欧拉回路
- Codeforces 788B Weird journey (欧拉回路 组合数计数)
- CodeForces 527E Data Center Drama(欧拉回路)
- codeforces 723E (欧拉回路)
- CodeForces 325 E.The Red Button(欧拉回路)
- Codeforces 91C Ski Base 加边求欧拉回路数量
- Codeforces 788B Weird journey(欧拉回路)
- Codeforces 723e [图论][欧拉回路]
- CodeForces - 788B Weird journey(欧拉回路)
- codeforces 723E:One-Way Reform
- Codeforces 91C Ski Base 加边求欧拉回路数量