题目

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. 华为运动健康服务Health Kit 6.10.0版本新增功能速览!

    华为运动健康服务(HUAWEI Health Kit)6.10.0 版本新增的能力有哪些? 阅读本文寻找答案,一起加入运动健康服务生态大家庭! 一. 支持三方应用查询用户测量的连续血糖数据 符合申请H ...

  2. std::string 拼接字符串

    #include <iostream> #include <string> #include <sstream> int main() { // 方法一:12345 ...

  3. 机器学习常见的sampling策略 附PyTorch实现

    简单的采样策略 首先介绍三种简单采样策略: Instance-balanced sampling, 实例平衡采样. Class-balanced sampling, 类平衡采样. Square-roo ...

  4. 【鸿蒙千帆起】高德地图携手HarmonyOS NEXT,开启智能出行新篇章

    2024年1月18日下午,华为举办了鸿蒙生态千帆启航仪式,对外宣布HarmonyOS NEXT星河预览版现已开放申请,同时,首批200+鸿蒙原生应用加速开发,鸿蒙生态设备数量更是突破了8亿大关.这些进 ...

  5. HDC2021技术分论坛:跨端分布式计算技术初探

    作者:zhengkai,分布式通信首席技术专家 当今的移动应用都向着智能化和多样化方向发展,例如AI辅助,VR/AR应用,沉浸式游戏等.然而现实中的移动设备,因为便携性要求受限于尺寸.电池容量以及温控 ...

  6. 2024-04-13:用go语言,给定一个整数数组 `nums`, 请编写一个函数,返回一个新的数组 `counts`。 满足以下条件:对于每个 `nums[i]`, `counts[i]` 表示在

    2024-04-13:用go语言,给定一个整数数组 nums, 请编写一个函数,返回一个新的数组 counts. 满足以下条件:对于每个 nums[i], counts[i] 表示在 nums[i] ...

  7. nginx 如何代理websocket

    前言 下面是配置nginx websocket 的代码. # HTTPS server map $http_upgrade $connection_upgrade { default upgrade; ...

  8. 力扣1050(MySQL)-合作过至少三次的演员和导演(简单)

    题目: ActorDirector 表: 写一条SQL查询语句获取合作过至少三次的演员和导演的 id 对 (actor_id, director_id) 示例:  建表语句: 1 create tab ...

  9. 力扣1662(java&python)-检查两个字符串数组是否相等(简单)

    题目: 给你两个字符串数组 word1 和 word2 .如果两个数组表示的字符串相同,返回 true :否则,返回 false . 数组表示的字符串 是由数组中的所有元素 按顺序 连接形成的字符串. ...

  10. 阿里云 VPC 内网性能测试最佳实践

    ​简介:本文介绍了在阿里云 VPC 内网执行性能测试的方法.相较于传统的公网性能测试,VPC 内网性能测试完全在客户 VPC 环境进行,无需暴露服务到公网,安全性更高,灵活性更强. 作者:风起 背景 ...