zoukankan      html  css  js  c++  java
  • 「CF527E」 Data Center Drama

    「CF527E」 Data Center Drama

    传送门

    显然一个环肯定满足题目条件。

    然后我就开始想:先整一棵 ( exttt{DFS}) 树,然后非树边从深度深的节点向深度浅的节点连边,这样可以构成若干个环,再将奇度数点两两配对......

    然后这显然不太对...构成的环可能有公共边......

    然后事实上如果所有入度出度都为偶数的话总度数也为偶数,那么这个图是有欧拉回路的。

    但是有欧拉回路并不一定能够满足条件,还需要总边数为偶数。

    所以将奇数点相连过后再视情况加入自环即可。

    最后跑一遍欧拉回路,相邻两条边反向即可。

    /*---Author:HenryHuang---*/
    /*---Never Settle---*/
    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1e6+5;
    struct edge{
    	int to,nex;
    }e[maxn<<2];
    int head[maxn],cnt=1,cur[maxn];
    void add(int a,int b){
    	e[++cnt]=(edge){b,head[a]};
    	head[a]=cnt;
    }
    int deg[maxn];
    int odd[maxn],tot;
    int vis[maxn<<2];
    int k;
    void dfs(int u){
    //	cerr<<u<<'
    ';
    	for(int &i=head[u];i;i=e[i].nex){
    		if(vis[i]) continue;
    		vis[i]=vis[i^1]=1;
    		int v=e[i].to;
    		dfs(v);
    		if((++k)&1) cout<<u<<' '<<v<<'
    ';
    		else cout<<v<<' '<<u<<'
    ';
    	}
    }
    int main(){
    	ios::sync_with_stdio(0);
    	cin.tie(0),cout.tie(0);
    	int n,m;cin>>n>>m;
    	for(int i=1;i<=m;++i){
    		int a,b;cin>>a>>b;
    		add(a,b),add(b,a);
    		++deg[a],++deg[b];
    	} 
    	for(int i=1;i<=n;++i) if(deg[i]&1) odd[++tot]=i;
    	for(int i=1;i<=tot;i+=2) add(odd[i],odd[i+1]),add(odd[i+1],odd[i]),++m;
    	if(m&1) add(1,1),add(1,1),++m;
    	cout<<m<<'
    ';
    	dfs(1);
    	return 0;
    }
    
    在繁华中沉淀自我,在乱世中静静伫立,一笔一划,雕刻时光。
  • 相关阅读:
    poj2392 Space Elevator(多重背包问题)
    poj1703 Find them, Catch them(并查集的应用)
    HDU 1867 A + B for you again(KMP算法的应用)
    HDU 1358 Period(kmp简单解决)
    nyoj 460 项链 (区间dp)
    Python内置函数(9)——callable--转载
    Python的hasattr() getattr() setattr() 函数使用方法详解--转载
    python assert 断言详细用法格式
    sam文件格式
    Linux中重定向--转载
  • 原文地址:https://www.cnblogs.com/HenryHuang-Never-Settle/p/solution-CF527E.html
Copyright © 2011-2022 走看看