尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

CF19E Fairy

CF19E Fairy
📅 发布时间:2026/6/20 22:08:04
题意:给定一个无向图,$n,m \le 10^4$,需对每个点黑白染色,使每条边两端点颜色不同,求对每一条边,删除该边后是否存在合法染色方案。思路:合法染色方案即删除边后图为二分图,不存在奇环。先构造 dfs 生成树,将一条非树边和其覆盖树边形成的环称为基本环,包含多个非树边的环长奇偶性等于各基本环奇偶性异或和。特判原图无环情况,树边成为答案边需满足不存在长度为奇数的不包含它的基本环,且包含它的基本环长度都为奇数,可用树上差分求解;非树边成为答案边需满足不存在其他长度为奇数的基本环,总时间复杂度为线性。

CF19E Fairy

题意

给你一个无向图。你需要给每个点黑白染色。一个合法的染色方案为:每条边的两个端点颜色都不同。

对每一条边,求删除这一条边之后,是否存在合法的染色方案。

\(n,m \le 10^4\)。

思路

显然转化成删除一条边后不存在奇环,也即是一个二分图。

这个数据范围容易让人想到追忆。但是好像和 bitset 并没有关系啊?

第一篇题解提供了线性做法,很有教育意义。


如果枚举每条边,判断是否合法,复杂度很难降下来。

不如先发掘一下答案边有哪些性质。

原图中有若干奇环,显然答案边必须是所有奇环的交。

显然我们不可能求出所有奇环。


先弄出一棵 dfs 生成树。

然后有若干返祖边。没有横叉边,因为是无向图 dfs 树。

只包含一条非树边的环是好处理的,我们把一条非树边和它覆盖的树边形成的环叫做这个非树边的基本环。

一个包含多个非树边的环,环长奇偶性等于每个非树边的基本环的奇偶性异或和。


可以先特判不需要删除任何边也没有奇环的情况。

一个树边要成为答案边,需要满足:

  1. 不存在长度为奇数的,不包含它的基本环。

也不能存在长度为奇数的,不包含它的,包含多个非树边的环。

满足条件 1 后,只要包含它的基本环长度都是奇数,就满足上面这个条件。所以:

  1. 包含它的基本环长度都是奇数。

使用树上差分可以线性求。

至于 LCA,是不需要求的,因为只有返祖边。


一个非树边要成为答案边,需要满足:

  1. 不存在其他长度为奇数的基本环。

没了。

所以总时间复杂度线性。

不会套路 www

code

#include<bits/stdc++.h>
#define sf scanf
#define pf printf
#define rep(x,y,z) for(int x=y;x<=z;x++)
#define per(x,y,z) for(int x=y;x>=z;x--)
using namespace std;
typedef long long ll;
namespace wing_heart {constexpr int N=1e4+7;int n,m;struct pii {int id,v;};vector<pii> son[N];vector<int> ans;bool vi[N];int dep[N];int cnt[N][2];int cnt1;void dfs(int u,int fa,int fr) {vi[u]=1;dep[u]=dep[fa]+1;for(pii p : son[u]) {if(p.id==fr) continue;int v=p.v;if(!vi[v]) {dfs(v,u,p.id);} else if(dep[u]>dep[v]) {int op = (dep[u]-dep[v]+1)&1;cnt[u][op]++;cnt[v][op]--;if(op) ++cnt1;}}}void solve(int u,int fr) {vi[u]=1;for(pii p : son[u]) {if(p.id==fr) continue;int v=p.v;if(!vi[v]) {solve(v,p.id);if(cnt[v][0]==0 && cnt[v][1]==cnt1) ans.push_back(p.id);cnt[u][0]+=cnt[v][0];cnt[u][1]+=cnt[v][1];} else if(dep[u]>dep[v]) {int op = (dep[u]-dep[v]+1)&1;if(op && cnt1==1) ans.push_back(p.id);}}}void main() {sf("%d%d",&n,&m);rep(i,1,m) {int u,v;sf("%d%d",&u,&v);son[u].push_back({i,v});son[v].push_back({i,u});}rep(i,1,n) {if(!vi[i]) dfs(i,0,0);}if(!cnt1) {pf("%d\n",m);rep(i,1,m) pf("%d ",i);exit(0);}memset(vi,0,sizeof(vi));rep(i,1,n) {if(!vi[i]) solve(i,0);}sort(ans.begin(),ans.end());pf("%d\n",(int)ans.size());for(int x : ans) pf("%d ",x);}
}
int main() {#ifdef LOCALfreopen("in.txt","r",stdin);freopen("my.out","w",stdout);#endifwing_heart :: main();
}

本文来自博客园,作者:wing_heart,转载请注明原文链接:https://www.cnblogs.com/wingheart/p/19087339

相关新闻

  • 鸿蒙应用开发从入门到实战(三):第一个鸿蒙应用
  • Litctf2025 Write-up
  • DFS算法(递归)

最新新闻

  • 别被忽悠了!2026实测靠谱的AI论文工具|实测必入避坑版
  • BLEURT、xCOMET与KIWI-23:多语言机器翻译评估指标深度对比与实战选型
  • 嵌入式GUI开发实战:emWin下拉列表与编辑框控件深度解析
  • Android JSONObject解析原理与工程化防护实践
  • 3步掌握终极Windows窗口调整方案:WindowResizer高效工作指南
  • 构建可视化可追溯性框架:从数据血缘到交互审计的完整实践

日新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

周新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号