题目

CF527E Data Center Drama · 戳这里

题意

  • 给定一张 $n$ 个点 $m$ 条边的连通无向图。
  • 你需要加尽可能少的边,然后给所有边定向,使得每一个点的出入度都是偶数。
  • 边可以是自环,也可以有重边。
  • $n \le 10^5$,$m \le 2 \times 10^5$。

(本题是 SPJ,所以顺序不用管)

题解

思路

所有顶点度数都为偶数,且该图是连通图,是无向图存在欧拉回路的充要条件。

所以我们需要将所有顶点度数为奇数的点两两相连,但是并不是所有存在欧拉回路的图都满足条件,还需要满足边数为偶数。

所以如果最后边数是奇数,随便找个点连个自环即可(这里就把 1 号节点连一个自环了)。

这显然是最少的加边方案,最后跑一个欧拉回路出来,然后隔一条边换一个方向即可。

详解

首先,存图我们用链式前向星存,然后在记录每个点的入度。

这里我们第一条边从 $2$ 开始记,因为这样我们按顺序记录正着的边和反着的边,反着的边的编号就等于正着的边的编号异或 $1$。

int edge_tot = 1;
int in_cnt[N];
int head[N]; struct Edge {
int to;
int nxt;
}; Edge edge[N]; void add(int u, int v) {
++edge_tot;
edge[edge_tot].to = v;
edge[edge_tot].nxt = head[u];
head[u] = edge_tot;
++in_cnt[v];
}

接下来是主函数的输入部分。

int n, m;
int u, v;
scanf("%d%d", &n, &m);

for(int i = 1; i <= n; ++i)
head[i] = -1; for(int i = 1; i <= m; ++i) {
scanf("%d%d", &u, &v);
add(u, v);
add(v, u);
}

然后记录一下入度为奇数的点。

我们用一个 $vector$ 来存。

vector <int> ill;

然后将所有入度为奇数的点都压进去。

for(int i = 1; i <= n; ++i)
if(in_cnt[i] & 1)
ill.push_back(i);

再把它们两两相连。

for(int i = 0; i < ill.size(); i += 2) {
add(ill[i], ill[i + 1]);
add(ill[i + 1], ill[i]);
++m;
}

然后判断如果这时候边数 $m$ 是奇数,就给 $1$ 号节点加个自环。

if(m & 1) {
add(1, 1);
++m;
}

先输出一个边数 $m$。

printf("%d\n", m);

然后就是输出边了,这里跑个欧拉回路就行了。

bool vis[N];
int print_tot; void dfs(int u) {
for(int &i = head[u]; i != -1; ) {
int v = edge[i].to; if(vis[i]) {
i = edge[i].nxt;
continue;
} vis[i] = vis[i ^ 1] = true; i = edge[i].nxt; dfs(v); ++print_tot; if(print_tot & 1)
printf("%d %d\n", u, v);
else
printf("%d %d\n", v, u);
}
}

注意事项

  • for(int &i = head[u]; i != -1; ) 里的 &i

  • i = edge[i].nxt; 要写两遍,不能提到前面,否则后面的 i 就都变了。

代码

#include <cstdio>
#include <vector>
using namespace std; const int N = 1e6 + 5; int n, m;
int u, v;
int edge_tot = 1;
int in_cnt[N];
vector <int> ill;
bool vis[N];
int print_tot;
int head[N]; struct Edge {
int to;
int nxt;
}; Edge edge[N]; void add(int u, int v) {
++edge_tot;
edge[edge_tot].to = v;
edge[edge_tot].nxt = head[u];
head[u] = edge_tot;
++in_cnt[v];
} void dfs(int u) {
for(int &i = head[u]; i != -1; ) {
int v = edge[i].to; if(vis[i]) {
i = edge[i].nxt;
continue;
} vis[i] = vis[i ^ 1] = true; i = edge[i].nxt; dfs(v); ++print_tot; if(print_tot & 1)
printf("%d %d\n", u, v);
else
printf("%d %d\n", v, u);
}
} int main() {
scanf("%d%d", &n, &m); for(int i = 1; i <= n; ++i)
head[i] = -1; for(int i = 1; i <= m; ++i) {
scanf("%d%d", &u, &v);
add(u, v);
add(v, u);
} for(int i = 1; i <= n; ++i)
if(in_cnt[i] & 1)
ill.push_back(i); for(int i = 0; i < ill.size(); i += 2) {
add(ill[i], ill[i + 1]);
add(ill[i + 1], ill[i]);
++m;
} if(m & 1) {
add(1, 1);
++m;
} printf("%d\n", m); dfs(1); return 0;
}

AC 记录

提交记录 · 戳这里

尾声

如果这篇博客对您(您的团队)有帮助的话,就帮忙点个赞,加个关注!

最后,祝您(您的团队)在 OI 的路上一路顺风!!!

┬┴┬┴┤・ω・)ノ ByeBye

CF527E Data Center Drama 题解的更多相关文章

  1. CF527E Data Center Drama

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

  2. CF527E Data Center Drama(构造+欧拉回路)

    题目链接 大意: 给你一个无向图. 要求加最少的边,然后给这些无向图的边定向,使得每一个点的出入度都是偶数. 输出定向后的边数和边集. n<=10^5 m<=2*10^5 很巧妙的构造题- ...

  3. 「CF527E」 Data Center Drama

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

  4. 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 ...

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. CentOS 8 安装 oracle 23c CentOS9 Error deal

    1.环境准备 软件准备 序号 软件 下载地址 1 VirtualBox https://www.virtualbox.org/wiki/Downloads 2 CentOS Stream 8 http ...

  2. 重新整理.net core 计1400篇[三] (.net core 如何源代码调试和查看源码 )

    前言 本来这里是写源代码的,因为vs没有那么容易调试查看到源代码,所以先把调试源代码和查看源代码弄完. 正文 需要修改一些vs配置,这个vs也是有要求的,要vs2017. 那么你还需要加载远程符号. ...

  3. CentOS7.9 systemctl

    目录 命令格式 语法 加载配置文件 关机和开机 unit 文件存放位置 unit 格式说明 service unit file 文件构成部分 unit 段的常用选项 service 段的常用选项 in ...

  4. linux中nginx的https证书过期替换

    linux中nginx的https证书过期替换 工作记录,不然老是忘 一般提示这个就说明过期了 首先把新的证书换上去,最好和之前的文件名字一样,这样就不用改配置文件了 路径就自己找了需要,不过一般挺好 ...

  5. Linux命令之查找CPU资源利用情况(lscpu和top详解)

    1.lscpu命令:获取CPU架构完整详细信息,例如架构信息,CPU模式,CPU频率,CPU核心数.线程数.缓存大小. 在终端输入"lscpu": 参数详解: [Architect ...

  6. Serverless JOB | 传统任务新变革

    简介: SAE Job 重点解决了用户的效率和成本问题,在兼具传统任务使用体验和功能的同时按需使用,按量计费,做到低门槛任务上云,节省闲置资源成本. Job 作为一种运完即停的负载类型,在企业级开发中 ...

  7. 深入浅出FlatBuffers原理

    简介: FlatBuffers 是一个开源的.跨平台的.高效的.提供了多种语言接口的序列化工具库.实现了与 Protocal Buffers 类似的序列化格式.主要由 Wouter van Oortm ...

  8. 先行一步,7大技术创新和突破,阿里云把 Serverless 领域的这些难题都给解了

    ​简介: 函数计算 FC 首创 GPU 实例.业内首发实例级别可观测和调试.率先提供端云联调和多环境部署能力.GB 级别镜像启动时间优化至秒级.VPC 网络建连优化至200ms,Serverless ...

  9. [PHP] 浅谈 Laravel 三大验证方式的区别, auth:api, passport, auth:airlock

    auth:api 最先出来,提供了最简单和最实用的方式进行 api 身份校验. 关于它的含义和用法你可以参考以下两篇: 浅谈 Laravel Authentication 的 auth:api 浅谈 ...

  10. 如何将本地项目第一次同步到gitee远程

    一,Gitee账号的注册/登录 在gitee登录入口输入相关信息进行注册登录https://gitee.com/signup#lang=zh-CN 二,本地安装git客户端并配置用户信息 1.Git ...