4769. graph

博客围绕判断无向图是否为二分图的问题展开,该图会进行增删边操作。先介绍了暴力解法可得30分,只有插入操作时用并查集可拿50分。正解是建以时间为下标的权值线段树,用dfs遍历,回溯时暴力修改并查集。还提到用前向星存储边。
题目描述
  • 对于一个图, 如果它的点集能被分成两个部分, 使得在原图中每一部分之间的点没有任何边相连,则该图被称为二分图。
  • 现在给定一个无向图,每次增加一条边,或者删除一条边。要求您每次判断它是不是二分图。
数据范围

在这里插入图片描述

暴力
  • 对于前30分,我们显然可以直接暴力。
  • 如果是插入操作就直接把边加进去,然后判断一下它是否会组成奇环,如果是的话就直接输出“NO”,然后看其中的换最早删去的边,很显然至少要等到那条边被删去时才有可能重新输出“YES”。
  • 这样30分就到手了。
只有插入操作
  • 我们可以用并查集来维护一下。
  • 因为只有加边,很显然只要输出“NO”,以后就一定只会输出“NO”了。
  • 所以我们就可以直接建立一个并查集来判断是否有奇环的出现。
  • 紧接着再加上暴力,你可以拿到50分的好成绩。
正解
  • 删除操作是并查集的“天敌”,很自然地我们会想到避免进行删除操作。
  • 注意到每条边存在的时间都一定是一个连续的区间,所以我们可以建一个以时间为下标的权值线段树。然后把每条边按其相应的出现时间扔进线段树里面。这样我们查询一个时间点的时候就可以从根到叶子只加边,不删边。
  • 但如果每个时间点一一分开查询的话,很显然我们是可以构造出数据使这种方法超时,所以我们不妨以一种遍历(dfs)的方式来遍历这棵权值线段树。递归进去显然就是简单的加边。
  • 但问题来了,回溯的时候不就又要删边了吗?怎么搞?
  • 但只要我们细心观察,就会发现这里的删边和原来的删边有一些不一样:这里删的边和在这一层插入的边是一样的。也就是说在进行完删除操作之后,整个并查集其实就像是没有被动过一样,所以我们可以暴力把在这一层插入边时所修改的并查集上的东西记录下来,到时候回溯时再暴力改回去。做好按秩合并,不要路径压缩,这样插入边时并查集改动得比较少,容易改回来。
  • 然后你就发现你会做这道题了。
注意事项
  • 把边扔进线段树里时最好用前向星来存储。
[atao@DESKTOP-3UAJOL8 system32]$ # 更新 Arch Linux 和 Manjaro 的密钥环 sudo pacman -Sy archlinux-keyring manjaro-keyring # 刷新本地密钥库 sudo pacman-key --refresh-keys error: wslutilities: signature from "WSL Utilities Package Signing Key <contact@wslutiliti.es>" is unknown trust :: Synchronizing package databases... core is up to date extra is up to date multilib is up to date wslutilities 1153.0 B 304 B/s 00:04 [########################################] 100%error: wslutilities: signature from "WSL Utilities Package Signing Key <contact@wslutiliti.es>" is unknown trust error: failed to synchronize all databases (invalid or corrupted database (PGP signature)) gpg: key BA1DFB64FFF979E7: "Allan McRae (Arch Linux Master Key) <allan@master-key.archlinux.org>" not changed gpg: key BA1DFB64FFF979E7: "Allan McRae (Arch Linux Master Key) <allan@master-key.archlinux.org>" not changed gpg: Total number processed: 2 gpg: unchanged: 2 pub rsa4096 2011-11-29 [SC] [revoked: 2022-05-10] *** This key has been disabled AB19265E5D7D20687D303246BA1DFB64FFF979E7 uid [ revoked] Allan McRae (Arch Linux Master Key) <allan@master-key.archlinux.org> gpg: key D6D055F927843F1C: "Levente Polyak (Arch Linux Master Key) <anthraxx@master-key.archlinux.org>" not changed gpg: key D6D055F927843F1C: "Levente Polyak (Arch Linux Master Key) <anthraxx@master-key.archlinux.org>" not changed gpg: Total number processed: 2 gpg: unchanged: 2 pub rsa4096 2018-11-08 [SC] D8AFDDA07A5B6EDFA7D8CCDAD6D055F927843F1C uid [ full ] Levente Polyak (Arch Linux Master Key) <anthraxx@master-key.archlinux.org> sub rsa4096 2018-11-08 [E] sub rsa4096 2018-11-08 [A] gpg: key 9B729B06A680C281: "Bartłomiej Piotrowski (Arch Linux Master Key) <bpiotrowski@master-key.archlinux.org>" not changed gpg: key 9B729B06A680C281: "Bartłomiej Piotrowski (Arch Linux Master Key) <bpiotrowski@master-key.archlinux.org>" not changed gpg: Total number processed: 2 gpg: unchanged: 2 pub rsa4096 2017-05-15 [SC] [revoked: 2017-05-15] *** This key has been disabled DDB867B92AA789C165EEFA799B729B06A680C281 uid [ revoked] Bartłomiej Piotrowski (Arch Linux Master Key) <bpiotrowski@master-key.archlinux.org> gpg: key A88E23E377514E00: "Florian Pritz (Arch Linux Master Key) <florian@master-key.archlinux.org>" not changed gpg: key A88E23E377514E00: "Florian Pritz (Arch Linux Master Key) <florian@master-key.archlinux.org>" not changed gpg: Total number processed: 2 gpg: unchanged: 2 pub rsa4096 2015-12-17 [SC] 91FFE0700E80619CEB73235CA88E23E377514E00 uid [ full ] Florian Pritz (Arch Linux Master Key) <florian@master-key.archlinux.org> sub rsa4096 2015-12-17 [E] gpg: key 3348882F6AC6A4C2: "Pierre Schmitz (Arch Linux Master Key) <pierre@master-key.archlinux.org>" not changed gpg: key 3348882F6AC6A4C2: "Pierre Schmitz (Arch Linux Master Key) <pierre@master-key.archlinux.org>" not changed gpg: Total number processed: 2 gpg: unchanged: 2 pub rsa3072 2011-11-18 [SC] [revoked: 2018-10-07] *** This key has been disabled 0E8B644079F599DFC1DDC3973348882F6AC6A4C2 uid [ revoked] Pierre Schmitz (Arch Linux Master Key) <pierre@master-key.archlinux.org> gpg: key A04F9397CDFD6BB0: "Dan McGee (Arch Linux Master Key) <dan@master-key.archlinux.org>" not changed gpg: key A04F9397CDFD6BB0: "Dan McGee (Arch Linux Master Key) <dan@master-key.archlinux.org>" not changed gpg: Total number processed: 2 gpg: unchanged: 2 pub rsa3072 2011-11-29 [SC] [revoked: 2011-11-29] *** This key has been disabled 27FFC4769E19F096D41D9265A04F9397CDFD6BB0 uid [ revoked] Dan McGee (Arch Linux Master Key) <dan@master-key.archlinux.org> gpg: key 7EFD567D4C7EA887: "Ionut Biru (Arch Linux Master Key) <ionut@master-key.archlinux.org>" not changed gpg: key 7EFD567D4C7EA887: "Ionut Biru (Arch Linux Master Key) <ionut@master-key.archlinux.org>" not changed gpg: Total number processed: 2 gpg: unchanged: 2 pub rsa3072 2011-11-25 [SC] [revoked: 2011-11-25] *** This key has been disabled 44D4A033AC140143927397D47EFD567D4C7EA887 uid [ revoked] Ionut Biru (Arch Linux Master Key) <ionut@master-key.archlinux.org> gpg: key 5184252D824B18E8: "Thomas Bächler (Arch Linux Master Key) <thomas@master-key.archlinux.org>" not changed gpg: key 5184252D824B18E8: "Thomas Bächler (Arch Linux Master Key) <thomas@master-key.archlinux.org>" not changed gpg: Total number processed: 2 gpg: unchanged: 2 pub rsa3072 2011-11-19 [SC] [revoked: 2011-11-20] *** This key has been disabled 684148BB25B49E986A4944C55184252D824B18E8 uid [ revoked] Thomas Bächler (Arch Linux Master Key) <thomas@master-key.archlinux.org>接下来该怎么做
07-12
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值