CF527E Data Center Drama 题解

这篇文章讲述了如何解决CF527E题目,即在一个连通无向图中,通过最少的边添加使其所有顶点度数变为偶数,确保存在欧拉回路。关键步骤包括使用链式前向星存储图、记录入度、连接奇数度顶点并可能添加自环,最后通过欧拉路径确定边的方向。

题目

CF527E Data Center Drama · 戳这里

题意

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

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

题解

思路

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

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

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

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

详解

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

这里我们第一条边从 2 2 2 开始记,因为这样我们按顺序记录正着的边和反着的边,反着的边的编号就等于正着的边的编号异或 1 1 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;
	
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值