当前位置: 首页 > news >正文

【CF19E】Fairy - Harvey

题意

给定一个无向图,问删掉那条边使得给图可以变成一个二分图。

思路

回顾二分图的定义:不存在奇环的图。
由于不保证连通图,所以可以把整个图分成若干个连通块来考虑。

  1. 若所有连通块都是二分图:则此时删掉哪一条边剩下的都能形成二分图,答案是 \(m\).
  2. 若存在两个及以上的连通块是二分图:则此时不合法,删掉那一条边都一定会有二分图。

限制掉前两种后,接下来考虑只有一个连通块是二分图,于是可以转化为一个连通图的问题。
若删去一条边使得删完后不存在奇环,则删去的边一定满足以下条件:

  1. 在所有奇环中。
    如果删去的边不在其中一个奇环里面,则连通图一定还存在一个奇环,此时不可能为二分图。
  2. 不在任意一个偶环中。
    考虑要删的一条边,一定满足以下性质:
    First.一定连通两个连通块。
    Second.一定有一条另外的边联通两个连通块,形成一个奇环。
    考虑到如果删去这条边的效果是可以给其中一个连通块的点都变色,才能使得染色不矛盾。
    而此时若存在一个偶环,则变完色后偶环的点又会有矛盾了,即证。

然后接下来就是怎么来写了。
可以把连通图以 \(DFS\) 树的方式显现,则每一个环都存在一条返祖边,然后就可以用树上差分做了。

code

#include<bits/stdc++.h>
#define ll long longusing namespace std;const int N = 1e4+5;struct Edge{int to,nxt,id;
}e[N<<1];int tot=0,cnt=0,res=0;
int head[N],dep[N],s[N],fa[N],p;
bool flag=0;
bool vis[N];
vector<ll> vec;void add_Edge(int u,int v,int id){e[tot].to=v,e[tot].nxt=head[u],e[tot].id=id;head[u]=tot++;
}void dfs(int u,int f){dep[u]=dep[f]+1;fa[u]=f;vis[u]=1;for(int i=head[u];~i;i=e[i].nxt) {int v=e[i].to;if(v==f)continue;if(vis[v]){if(dep[v]<dep[u]){ll siz=dep[u]-dep[v]+1;if(siz&1)s[u]++,s[v]--,res++,flag=1,p=e[i].id;else s[u]--,s[v]++;}}else dfs(v,u);}
}void DFS(int u){vis[u]=1;for(int i=head[u];~i;i=e[i].nxt){int v=e[i].to,idx=e[i].id;if(vis[v])continue;DFS(v);s[u]+=s[v];if(s[v]==res)vec.push_back(idx);}
}
int n,m;
int main() {memset(head,-1,sizeof(head));cin>>n>>m;for(int i=1;i<=m;i++){int u,v;cin>>u>>v;add_Edge(u,v,i);add_Edge(v,u,i);}for(int i=1;i<=n;i++){flag=0;if(!vis[i])dfs(i,0);if(flag){cnt++;if(cnt>1){cout<<-1;return 0;}memset(vis,0,sizeof(vis));DFS(i);}}if(cnt){if(res==1)vec.push_back(p);cout<<vec.size()<<"\n";sort(vec.begin(),vec.end());for(int i=0;i<vec.size();i++)cout<<vec[i]<<" ";}else {cout<<m<<"\n";for(int i=1;i<=m;i++)cout<<i<<" ";}return 0;
}
http://www.zskr.cn/news/14038.html

相关文章:

  • 软件工程中线性回归应用
  • 构建移动网关:Air780EPM用4G为WiFi和LAN设备供网
  • 2025年人工智能与智能装备国际学术会议(AIIE 2025)
  • 详细介绍:衡石HQL深度解析:如何用类SQL语法实现跨源数据的高效联邦查询?
  • Java 类类型
  • 9月29日
  • 国内信创领域的PostgreSQL技术能力认证
  • redis-AOF持久化机制
  • 03-控制台项目创建与结构说明
  • ttkefu2026迎来永久免费的客服系统分享
  • 002- 学习环境搭建
  • 求局部最小值
  • Element-UI的transfer穿梭框组件数据量大解决方案
  • 【软件系统架构】系列七:系统性能——操作系统性能深入解析 - 实践
  • Linux 生成随机端口
  • 并发编程可见性
  • VsCode Ai插件
  • 写入方式、COW 与写放大
  • 黄金分割比
  • how create rhel8 local repository server
  • 借助Aspose.Email,使用 Python 读取 Outlook MSG 文件
  • 文件同步工具深度测评(2025版):同步盘夺冠
  • Oracle故障处理:数据库启动时遇到ORA-01578错误
  • AGC073C 赛后补题记录
  • 深入解析:【深度学习计算机视觉】03:目标检测和边界框
  • leetCode刷题记录1
  • 【Bluedroid】A2DP Source 音频流暂停流程解析[5]:停止流程及资源管理机制(btif_a2dp_source_stop_audio_req) - 教程
  • 【IEEE-CPS出版】2025年数据管理与计算机科学国际学术会议(ICDMCS 2025)
  • 实用指南:Unity单元测试:C语言轻量级框架实战
  • 【ACM出版】第五届管理科学和软件工程国际学术会议(ICMSSE 2025)