题目链接

大意:

给你一个无向图。

要求加最少的边,然后给这些无向图的边定向,使得每一个点的出入度都是偶数。

输出定向后的边数和边集。

n<=10^5 m<=2*10^5


很巧妙的构造题……

可以发现答案的下界是\(度数为奇数的点个数m + 度数为奇数的点个数/2\)

因为是无向图,度数为奇数的点不可能有奇数个,于是考虑往每两个度数为奇数的点间连一条边。于是就可以愉快地跑欧拉回路啦。跑出来后在欧拉回路上构造像\(a\rightarrow b\leftarrow c\rightarrow d ……y\rightarrow x\leftarrow a\)这样的路径就行了,相当于把每个点的度数平分。

那如果构造出来的欧拉回路是类似于\(a- b- c- a\)这样,只有奇数条边,怎么分都分不好怎么办?起点和终点加个自环就OK了。

代码:

#include <bits/stdc++.h>
#define N 100005
using namespace std;
void rd(int &x){
    int y=0;char c=getchar();
    while(c<'0' || c>'9') c=getchar();
    while(c>='0' && c<='9') y=y*10+c-'0',c=getchar();
    x=y;
}
struct ed{
    int v,nxt;
    bool f;
}e[N<<3];
int head[N],cnt=1,deg[N],p[1000005],tot=0;
bool vis[N];
void add(int u,int v){
    e[++cnt]=(ed){v,head[u],0},head[u]=cnt;
    e[++cnt]=(ed){u,head[v],0},head[v]=cnt;
}
void dfs(int u){
    for(int &i=head[u];i;i=e[i].nxt){
        int to=e[i].v;
        if(!e[i].f){
            e[i].f=1;
            e[i^1].f=1;
            dfs(to);
        }
    }
    p[++tot]=u;
}
int main(){
    int n,m,a,b,ans=0,lst=0,qwq=0,i;
    rd(n),rd(m);
    for(i=1;i<=m;++i){
        rd(a),rd(b);
        add(a,b);
        deg[a]++,deg[b]++;
    }
    for(i=1;i<=n;++i){
        if(deg[i]&1){
            ans++;
            if(ans%2==1) lst=i;
            else if(lst) add(lst,i);
        }
    }
    m+=ans/2;
    if(m&1) add(1,1),m++;
    printf("%d\n",m);
    for(i=1;i<=n;++i){
        if(!vis[i]){
            tot=qwq=0;
            dfs(i);
            for(i=1;i<tot;++i) printf("%d %d\n",p[i+qwq],p[i+(!qwq)]),qwq^=1;
        }
    }
}

CF527E Data Center Drama(构造+欧拉回路)的更多相关文章

  1. CF527E Data Center Drama

    链接CF527E Data Center Drama 题目大意:给你一个无向图,要求加最少的边,然后给这些无向图的边定向,使得每一个点的出入度都是偶数. \(n<=10^5,n\leq 2*10 ...

  2. Codeforces Round #296 (Div. 1) C. Data Center Drama 欧拉回路

    Codeforces Round #296 (Div. 1)C. Data Center Drama Time Limit: 2 Sec  Memory Limit: 256 MBSubmit: xx ...

  3. 「CF527E」 Data Center Drama

    「CF527E」 Data Center Drama 传送门 显然一个环肯定满足题目条件. 然后我就开始想:先整一棵 \(\texttt{DFS}\) 树,然后非树边从深度深的节点向深度浅的节点连边, ...

  4. Codeforces 527E Data Center Drama(欧拉回路)

    题意: 给定一个无向图连通图,把这个的无向边变成有向边,并添加最少的有向边使这个图每个结点的出度为偶数. Solution: 题目很长,并且很多条件说的不太直接,确实不太好懂. 首先先看得到的无向图, ...

  5. Data Center Drama 欧拉回路的应用

    这题说的是给了n个点 和m条边, 这m条边是无向的,任务是将这些边变成有向的,并且添加最少的有向边使得这个图中每个点的入度为偶数, 出度为偶数. 我们可以考虑使用欧拉回路来解决这个问题,这样说,假如一 ...

  6. Codeforces Gym 100513D D. Data Center 前缀和 排序

    D. Data Center Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/560/proble ...

  7. Data Center手册(4):设计

    基础架构 拓扑图 Switching Path L3 routing at aggregation layer L2 switching at access layer L3 switch融合了三种功 ...

  8. Data Center手册(2): 安全性

    有个安全性有下面几种概念: Threat:威胁 Vulnerability: 安全隐患 Attack: 攻击 有关Threat 常见的威胁有下面几种 DoS(Denial of Service拒绝服务 ...

  9. Data Center手册(1):架构

    如图是数据中心的一个基本架构 最上层是Internet Edge,也叫Edge Router,也叫Border Router,它提供数据中心与Internet的连接. 连接多个网络供应商来提供冗余可靠 ...

随机推荐

  1. centos 检测aufs 并安装

    http://www.cnblogs.com/logo-fox/p/7366506.html 因为DeviceMapper不稳定,所以必须升级到3.10以上的内核,运行docker(2.6提示运行do ...

  2. Satis搭建composer私有库(自定义下载目录)

    在我们的日常php开发中需要使用大量的第三方包和类库, 怎么管理是一个问题, 我们用的Yii2框架, 但是并没有把composer用起来, 由于最近更换为docker部署项目, 于是想起来用compo ...

  3. Es6数值拓展

    Es6数值拓展 一,Number扩展 1,ES6 提供了二进制和八进制数值的新的写法,分别用前缀0b(或0B)和0o(或0O)表示. 将0b和0o前缀的字符串数值转为十进制,要使用Number方法 N ...

  4. Oracle 序列(sequence)

    序列(sequence) 是Oracle提供的用于生成一系列唯一数字的数据库对象.它会自动生成顺序递增或者递减的序列号,以实现自动提供唯一的主键值.序列可以在多用户并发环境中使用,并且可以为所有用户生 ...

  5. Azure系列1.1.2 —— 用于 IntelliJ 的 Azure 工具包的登录说明

    (文中大部分内容(95%)Azure官网上有,我只是把我自己实际操作中遇到的问题在这里阐述一下.) 先决条件 若要完成文章中的步骤,需要安装用于 IntelliJ 的 Azure 工具包,该工具包需要 ...

  6. Spark join连接

    内链接

  7. SWT 几个sample网站

    https://www.programcreek.com/java-api-examples/org.eclipse.swt.custom.ScrolledComposite https://o7pl ...

  8. TestNG之测试执行后没有生成默认测试报告(IDEA)

    使用IDEA+TestNG进行测试,没有生成 测试报告,是因为没有勾选监听器使用默认报告,具体操作如下: “Run” -> "Edit Configurations" -&g ...

  9. Python学习之路————Day03

    今日内容: 1.IDE开发环境的安装 2.基本数据类型的使用 3.运算符 一. 算术运算符: 比较运算符 赋值运算符 逻辑运算符 身份运算符:is比较的是id 而==比较的是值 二.基本数据类型 为什 ...

  10. oracle ceil函数

    ceil和floor函数在一些业务数据的时候,有时还是很有用的. ceil(n) 取大于等于数值n的最小整数: floor(n)取小于等于数值n的最大整数 如下例子 SQL> select ce ...