CF527E Data Center Drama 题解
题目
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 题解的更多相关文章
- CF527E Data Center Drama
链接CF527E Data Center Drama 题目大意:给你一个无向图,要求加最少的边,然后给这些无向图的边定向,使得每一个点的出入度都是偶数. \(n<=10^5,n\leq 2*10 ...
- CF527E Data Center Drama(构造+欧拉回路)
题目链接 大意: 给你一个无向图. 要求加最少的边,然后给这些无向图的边定向,使得每一个点的出入度都是偶数. 输出定向后的边数和边集. n<=10^5 m<=2*10^5 很巧妙的构造题- ...
- 「CF527E」 Data Center Drama
「CF527E」 Data Center Drama 传送门 显然一个环肯定满足题目条件. 然后我就开始想:先整一棵 \(\texttt{DFS}\) 树,然后非树边从深度深的节点向深度浅的节点连边, ...
- 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 ...
- Codeforces 527E Data Center Drama(欧拉回路)
题意: 给定一个无向图连通图,把这个的无向边变成有向边,并添加最少的有向边使这个图每个结点的出度为偶数. Solution: 题目很长,并且很多条件说的不太直接,确实不太好懂. 首先先看得到的无向图, ...
- Data Center Drama 欧拉回路的应用
这题说的是给了n个点 和m条边, 这m条边是无向的,任务是将这些边变成有向的,并且添加最少的有向边使得这个图中每个点的入度为偶数, 出度为偶数. 我们可以考虑使用欧拉回路来解决这个问题,这样说,假如一 ...
- Codeforces Gym 100513D D. Data Center 前缀和 排序
D. Data Center Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/560/proble ...
- Data Center手册(4):设计
基础架构 拓扑图 Switching Path L3 routing at aggregation layer L2 switching at access layer L3 switch融合了三种功 ...
- Data Center手册(2): 安全性
有个安全性有下面几种概念: Threat:威胁 Vulnerability: 安全隐患 Attack: 攻击 有关Threat 常见的威胁有下面几种 DoS(Denial of Service拒绝服务 ...
- Data Center手册(1):架构
如图是数据中心的一个基本架构 最上层是Internet Edge,也叫Edge Router,也叫Border Router,它提供数据中心与Internet的连接. 连接多个网络供应商来提供冗余可靠 ...
随机推荐
- hive窗口分析函数使用详解系列二之分组排序窗口函数
1.综述 我们讨论面试中各大厂的SQL算法面试题,往往核心考点就在于窗口函数,所以掌握好了窗口函数,面对SQL算法面试往往事半功倍. 已更新第一类聚合函数类,点击这里阅读 hive窗口函数聚合函数类 ...
- 墨水污染的一角qsnctfwp
题目附件 在图片中最直接的信息是电话号码,将号码输入到搜索引擎,可以得到该书的出版社为:高等教育出版社. 进入高等教育出版社官网 根据物料号前四位.版次时间.印次时间,在官网中进行图书查询. 结合字数 ...
- @EnableDiscoveryClient 注解如何实现服务注册与发现
@EnableDiscoveryClient 是如何实现服务注册的?我们首先需要了解 Spring-Cloud-Commons 这个模块,Spring-Cloud-Commons 是 Spring-C ...
- Linq大白话深入浅出从零基础到手写开源工具兵贵神速系列(一)——为啥需要Linq
所有的技术创新都是为了解决编程实践中的难点和痛点! 如果我们不懂得这项技术所要解决的难点和痛点,我们在使用这项技术的时候就很可能走偏,在细节末节上隔靴搔痒,耗费很长的时间还掌握不了这项技术的精髓! 而 ...
- HarmonyOS NEXT应用开发之预加载so并读取RawFile文件
介绍 本示例主要介绍在TaskPool子线程中使用 dlopen 预加载 so 库并使用句柄调用库函数的方法,以及在Native中使用 pread 系统函数读取Rawfile文件的部分文本内容,并添加 ...
- 将 Terraform 生态粘合到 Kubernetes 世界
简介: 为了更高效,统一的管理云服务,IaC 思想近年来盛行,其中 Terrafrom 更是成功得到了几乎所有的云厂商的采纳和支持.以 Terrafrom 模型为核心的云服务 IaC 生态已经形成.然 ...
- Apache Flink 在实时金融数据湖的应用
简介: 本文由京东搜索算法架构团队分享,主要介绍 Apache Flink 在京东商品搜索排序在线学习中的应用实践 一.背景 在京东的商品搜索排序中,经常会遇到搜索结果多样性不足导致系统非最优解的问题 ...
- Linux系统诊断-内存基础
简介: Linux系统诊断-内存基础 1. 背景 谈及linux内存,很多时候,我们会关注free,top等基础命令.当系统遇到异常情况时,内存问题的根因追溯,现场诊断时,缺乏深层次的debug能力. ...
- [FAQ] GoLand 需要手动开启代码补全吗 ?
使用 go mod download 下载模块到本地缓存中,之后 GoLand 就会根据输入自动代码提示. Other:[FAQ] Goland 始终没有包代码的提示 Link:https://www ...
- SQL server 批量删除表
select 'drop table '+name+';' from sys.tables declare c cursor forselect NAME from sysobjects where ...