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 ...
随机推荐
- requests请求例子
实例一: class GetSalerInfo(View): def post(self, request): userid = request.POST/GET.get('userid',None) ...
- 使用pymysql
安装 pip3 install pymysql 连接.执行sql.关闭(游标) import pymysql mysql_connect_dict={ 'host':'127.0.0.1', 'por ...
- typescript-koa-postgresql 实现一个简单的rest风格服务器 —— 连接 postgresql 数据库
接上一篇,这里使用 sequelize 来连接 postgresql 数据库 1.安装 sequelize,数据库驱动 pg yarn add sequelize sequelize-typescri ...
- Java实现二分法排序
二分法:(二分法不是只能做数组,这里的数组只是为了举例) 在给出的有序排列的数组中,把目标值和数组中间值进行比较,如果相等,则返回中间值下标,如果目标值小于中间值,就从数组的前半段再次执行二分法查找, ...
- 广度优先遍历-BFS、深度优先遍历-DFS
广度优先遍历-BFS 广度优先遍历类似与二叉树的层序遍历算法,它的基本思想是:首先访问起始顶点v,接着由v出发,依次访问v的各个未访问的顶点w1 w2 w3....wn,然后再依次访问w1 w2 w3 ...
- KahaDB简介
ActiveMQ 5.3以后,出现了KahaDB.她是一个基于文件支持事务的消息存储器,是一个可靠,高性能,可扩展的消息存储器. 她的设计初衷就是使用简单并尽可能的快.KahaDB的索引使用一 ...
- JavaScript概念之screen/client/offset/scroll/inner/avail的width/left 分类: JavaScript HTML+CSS 2015-05-27 16:42 635人阅读 评论(0) 收藏
原文地址:http://caibaojian.com/js-name.html JS中获取各种宽度和距离,常常让我们混淆,各种浏览器的不兼容让我们很头疼,现在就在说说js中有哪些宽度和距离. 1.名词 ...
- Java - replace a character at a specific index in a string?
String are immutable in Java. You can't change them. You need to create a new string with the charac ...
- php -- 特殊变量的三种输出
----- 020-3outputs.php ----- <!DOCTYPE html> <html> <head> <meta http-equiv=&qu ...
- wordpress获取文章所属分类
1.获取全部分类 <?php foreach((get_the_category()) as $category){ echo $category->cat_name; } ?> 2 ...