cf19E. Fairy(奇环 二分图染色)
题意
Sol
非常有思维含量的一道题,队爷的论文里介绍了一种\(N \sqrt{N}\)的暴力然鹅看不懂。。
看了一下clj的\(O(nlogn)\)的题解,又翻了翻题交记录,发现\(O(n)\)的做法也不是特别难。。
首先考虑所有两端颜色相同的非树边。直接对它的数量讨论:
若为\(0\),那么删哪一条都可以
若为\(1\),那么只能删该奇环上的边
若\(>1\),所有的非树边都不能删(不管怎么删都会有一个奇环),那么考虑所有的树边,一条树边能被删掉当且仅当:所有奇环都经过了这条边 且没有偶环经过了这条边
那么直接在树上打差分标记即可
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 10;
inline int read() {
char c = getchar(); int x = 0, f = 1;
while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
int N, M, Pre[MAXN], even[MAXN], odd[MAXN], col[MAXN], cly, last, ans[MAXN], dep[MAXN];
struct Edge {
int u, v, id, nxt;
}E[MAXN];
int head[MAXN], num;
void AddEdge(int x, int y, int id) {
E[num] = (Edge) {x, y, id, head[x]};
head[x] = num++;
}
void dfs(int x, int fa) {
col[x] = col[fa] ^ 1; dep[x] = dep[fa] + 1;
for(int i = head[x]; ~i; i = E[i].nxt) {
int to = E[i].v;
if(col[to] == -1) {
Pre[to] = i; dfs(to, x);
even[x] += even[to];
odd[x] += odd[to];
} else if(dep[to] + 1 < dep[x]){
if(col[to] == col[x]) last = i, cly++, odd[x]++, odd[to]--;
else even[x]++, even[to]--;
}
}
}
int main() {
memset(head, -1, sizeof(head));
N = read(); M = read();
for(int i = 1; i <= M; i++) {
int x = read(), y = read();
AddEdge(x, y, i); AddEdge(y, x, i);
}
memset(col, -1, sizeof(col)); col[0] = 0;
for(int i = 1; i <= N; i++) if(col[i] == -1) dfs(i, 0);
if(cly == 0) {
printf("%d\n", M);
for(int i = 1; i <= M; i++) printf("%d ", i);
return 0;
}
if(cly == 1) ans[E[last].id] = 1;
for(int i = 1; i <= N; i++) if(odd[i] == cly && !even[i]) ans[E[Pre[i]].id] = 1;
int cnt = 0;
for(int i = 1; i <= M; i++) if(ans[i]) cnt++;
printf("%d\n", cnt);
for(int i = 1; i <= M; i++) if(ans[i]) printf("%d\n", i);
return 0;
}
cf19E. Fairy(奇环 二分图染色)的更多相关文章
- Hdu 5285 wyh2000 and pupil (bfs染色判断奇环) (二分图匹配)
题目链接: BestCoder Round #48 ($) 1002 题目描述: n个小朋友要被分成两班,但是有些小朋友之间是不认得的,所以规定不能把不认识的小朋友分在一个班级里面,并且一班的人数要比 ...
- HDU - 3478 Catch(判奇环/二分图)
http://acm.hdu.edu.cn/showproblem.php?pid=3478 题意 给一个无向图和小偷的起点,小偷每秒可以向相邻的点出发,问有没有一个时间点小偷可能出现在任何点. 分析 ...
- HDU3478 【判奇环/二分图的性质】
题意: 给你一幅图,给你一个起点,然后问你存不存在一个时刻,所有点可以在那个时刻到达. 思路: 这幅图首先是联通的: 如果出现奇数环,则满足在某一时刻都可能到达: 然后判断奇数环用二分图性质搞也是神奇 ...
- POJ 2942 Knights of the Round Table 补图+tarjan求点双联通分量+二分图染色+debug
题面还好,就不描述了 重点说题解: 由于仇恨关系不好处理,所以可以搞补图存不仇恨关系, 如果一个桌子上面的人能坐到一起,显然他们满足能构成一个环 所以跑点双联通分量 求点双联通分量我用的是向栈中pus ...
- Catch---hdu3478(染色法判断是否含有奇环)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3478 题意:有n个路口,m条街,一小偷某一时刻从路口 s 开始逃跑,下一时刻都跑沿着街跑到另一路口,问 ...
- [cf557d]Vitaly and Cycle(黑白染色求奇环)
题目大意:给出一个 n 点 m 边的图,问最少加多少边使其能够存在奇环,加最少边的情况数有多少种. 解题关键:黑白染色求奇环,利用数量分析求解. 奇环:含有奇数个点的环. 二分图不存在奇环.反之亦成立 ...
- poj2942 求v-DCC,二分图判奇环,补图
/* 给定一张无向图,求有多少点不被任何奇环包含 推论1:如果两个点属于两个不同的v-DCC,则他们不可能在同一个奇环内 推论2:某个v-DCC中有奇环,则这个v-DCC中所有点必定被属于某个奇环 只 ...
- [LA3523/uva10195]圆桌骑士 tarjan点双连通分量+奇环定理+二分图判定
1.一个环上的各点必定在同一个点双连通分量内: 2.如果一个点双连通分量是二分图,就不可能有奇环: 最基本的二分图中的一个环: #include<cstdio> #include<c ...
- 【POJ 2942】Knights of the Round Table(双联通分量+染色判奇环)
[POJ 2942]Knights of the Round Table(双联通分量+染色判奇环) Time Limit: 7000MS Memory Limit: 65536K Total Su ...
随机推荐
- d3.js在vue项目中的安装及案例
1. 安装: npm i d3 --save 2. 引入:main.js import * as d3 from "d3"; Vue.prototype.$d3 = d3; win ...
- redo log文件格式描述
- Spring框架的演变
什么是Spring 如果想要解释Spring,那么最难的部分就是对其进行分类.通常情况下,Spring被描述为构建Java应用程序的轻量级框架,但这种描述带来了两个有趣的观点. 首先,与许多其他框架( ...
- python再探
python是一门强大的高级编程语言,之前的文章中介绍了python的基础知识,接下来会介绍一些python更为高级的知识. 面向对象编程 基本知识 一般编程思想分为面向过程和面向对象,前者的基本单元 ...
- MySQL查询表结构命令
参考网址:https://www.cnblogs.com/zhangyuhang3/p/6873895.html 一.简单描述表结构,字段类型 desc tabl_name; desc tabl_na ...
- 解决Redisson出现Failed to instantiate [org.redisson.api.RedissonClient]: Factory method 'create' threw exception; nested exception is java.lang.ArrayIndexOutOfBoundsException: 0的问题
一.背景 最近项目中使用了redisson的哨兵模式来作为redis操作的客户端,然后一个意外出现了,启动报:Failed to instantiate [org.redisson.api.Redis ...
- ps切图 切png图片——学习笔记
第一步:新建一个图层,点击ps左上角“文件”,然后新建即可(或crtl+alt+n) 参数自己随便填,注意背景图片选择透明即可. 第二步:打开psd文件,点击工具中的“移动工具”,之后选中上面的“自动 ...
- 第一个 smarty 程序
原来使用普通的 PHP 代码,只需要一个文件,就可以完成功能. 而使用了 smarty后,会分成两个文件来完成,一个是模板文件,用于显示内容,一般后缀名为 *.tpl (但实际上任何后缀名都可以,建议 ...
- Solidity中如何判断mapping中某个键是否为空呢?
Solidity中如何判断mapping中某个键是否为空呢? 一.比较标准的做法是建立一个专门和value相关的结构体,用一个布尔型变量来看是否这个key所对应的value被赋过值 代码如下: pra ...
- PTA (Advanced Level) 1007 Maximum Subsequence Sum
Maximum Subsequence Sum Given a sequence of K integers { N1, N2, ..., NK }. A continuous su ...