题目

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. openGauss资源池化开发者入门指南(一)

    openGauss资源池化开发者入门指南(一) 一.内容简介 openGauss 资源池化是 openGauss 推出的一种新型的集群架构.通过 DMS 和 DSS 组件,实现集群中多个节点的底层存储 ...

  2. sql 语句系列(众数中位数与百分比)[八百章之第十五章]

    众数 众数就是出现最多的那个数. select sal,count(*) as cnt from emp where DEPTNO=20 group by sal 通过分组把他们的行数计算出来.那么最 ...

  3. 使用 Docker 部署 Draw.io 在线流程图系统

    1)介绍 Draw.io GitHub:https://github.com/jgraph/drawio Draw.io 是一款开源的绘制流程图的工具,拥有大量免费素材和模板.程序本身支持中文在内的多 ...

  4. 函数模板 及显式具体化(C++)

    函数模板 将同一种算法应用与不同类型的函数时 #include<iostream> #include<string> template <typename T> v ...

  5. resin报错:java.lang.IllegalStateException: block Block

    java.lang.IllegalStateException: block Block 启动resin时报错 主要的提示信息就是下面这个 java.lang.IllegalStateExceptio ...

  6. 迁移 Nacos 和 ZooKeeper,有了新工具

    简介: 注册中心迁移在行业中主要有两个方案,一个是双注册双订阅模式(类似数据库双写),一个是 Sync 模式(类似于数据库 DTS):MSE 同时支持了两种模式,对于开通 MSE 服务治理客户,MSE ...

  7. 云企业网CEN-TR打造企业级私有网络

    简介: 为了满足企业大规模.多样化的组网和网络管理需求,云企业网(CEN)提出了转发路由器TR(Transit Router)的概念.在每个地域内创建一个转发路由器,可以连接大量VPC.VBR,作为您 ...

  8. Flink 实时计算在微博的应用

    简介: 微博通过将 Flink 实时流计算框架跟业务场景相结合,在平台化.服务化方面做了很大的工作,在开发效率.稳定性方面也做了很多优化.我们通过模块化设计和平台化开发,提高开发效率. 微博机器学习研 ...

  9. 友盟+U-APM 移动应用性能体验报告:Android崩溃率达0.32%,OPPO 、华为、VIVO 崩溃表现良好

    简介: 应用性能稳定是良好用户体验中非常关键的一环,而现实情况却是应用崩溃.卡顿.加载缓慢.页面白屏等问题,频频出现在用户的真实体验之中,成为影响业务表现的直接杀手.为此,应用性能管理(APM)正在国 ...

  10. 用手机写代码:基于 Serverless 的在线编程能力探索

    ​简介:Serverless 架构的按量付费模式,可以在保证在线编程功能性能的前提下,进一步降低成本.本文将会以阿里云函数计算为例,通过 Serverless 架构实现一个 Python 语言的在线编 ...