[Codeforces 19E] Fiary
Brief Intro:
给定一个无向图,询问删去哪条边能使得剩下的图为一个二分图,输出所有结果
Algorithm:
关于二分图的重要性质:一个图为二分图的充要条件为其中没有奇环
1、如果没有奇环,那么删去任何一条边都不会使其变为奇环
2、如果存在一个或多个奇环,删去的边必为所有奇环的一条公共边
但这样仍然无法保证残余图是一个二分图:因为有偶环的存在
为了寻找奇环或者偶环,我们一般采取dfs树的方式
我们可以证明(奇偶性判断即可)当一个环上有两个偶返祖边或两个奇返祖边时,这个环必为偶环
而当一个环上有一个奇返祖边以及一个偶返祖边时,这个环必为奇环
如果一条边有一个奇环以及一个偶环通过,那么删去这条边后一定会出现一个环中包含一个奇返祖边和一个偶返祖边
从而出现奇环,不成立
题目被转化为:求出既是所有奇环公共边又不在任何一个偶环中的边
dfs树维护每条边经过的奇/偶环个数即可
Code:
#include <bits/stdc++.h> using namespace std;
typedef pair<int,int> P;
typedef long long ll;
#define F first
#define S second const int MAXN=1e4+;
int n,m,odd[MAXN],even[MAXN],vis[MAXN],match[MAXN],col[MAXN],st,cnt;
vector<P> G[MAXN];
vector<int> res; void dfs(int cur,int anc)
{
vis[cur]=;col[cur]=col[anc]^;
for(int i=;i<G[cur].size();i++)
{
P t=G[cur][i];
if(t.F==anc) continue;
if(!vis[t.F]) //将点和其父边配对
match[t.F]=t.S,dfs(t.F,cur),odd[cur]+=odd[t.F],even[cur]+=even[t.F];
else if(vis[t.F]==)
col[cur]==col[t.F]?odd[cur]++,st=t.S,cnt++:even[cur]++;
else
col[cur]==col[t.F]?odd[cur]--:even[cur]--; //如果到了一个环的起始点,那么该点的父边不在环中
}
vis[cur]=-; //不同的标记
} int main()
{
cin >> n >> m;
for(int i=;i<=m;i++)
{
int x,y;cin >> x >> y;
G[x].push_back(P(y,i));G[y].push_back(P(x,i));
} for(int i=;i<=n;i++)
if(!vis[i])
dfs(i,); if(cnt==)
for(int i=;i<=m;i++) res.push_back(i);
else
{
if(cnt==) res.push_back(st); //如果只有一个奇环,起始边也符合条件
for(int i=;i<=n;i++)
if(odd[i]==cnt && !even[i]) res.push_back(match[i]);
sort(res.begin(),res.end());
} cout << res.size() << endl;
for(int i=;i<res.size();i++)
cout << res[i] << " "; return ;
}
Review:
1、二分图的充要条件:不含奇环
同时不用考虑原图中的所有环,而只要考虑dfs树构造出的环即可
2、可采用dfs树的方式计算图中的奇、偶环
注意对一个环起始点的特殊处理
(UPD:实际上这是一个$dfs$树上差分的过程)
3、由于dfs树的无后效性,如果一个大环中包含两条返祖边,去掉两小环的公共路径*2,不改变两小环总和的奇偶性,从而能推断出大环的奇偶性
利用dfs树中的迭代性、公共路径推出有用的结论
4:注意很多时候只要考虑$dfs$返祖边的环即可!!!!
[Codeforces 19E] Fiary的更多相关文章
- bzoj 4424: Cf19E Fairy && codeforces 19E. Fairy【树形dp】
参考:https://blog.csdn.net/heheda_is_an_oier/article/details/51131641 这个找奇偶环的dp1真是巧妙,感觉像tarjan一样 首先分情况 ...
- Codeforces 19E 树上差分
思路: 先随便建出来一棵搜索树(图可能不连通?) 每一条非树边(剩下的边)和树边都可以构成一个环. 我们只看一个非树边和某些树边构成的这些环. 分成三种情况: 1.没有奇环 所有边都可以删 2.有一 ...
- Codeforces 19E&BZOJ 4424 Fairy(好题)
日常自闭(菜鸡qaq).不过开心的是看了题解之后1A了.感觉这道题非常好,必须记录一下,一方面理清下思路,一方面感觉自己还没有完全领会到这道题的精髓先记下来以后回想. 题意:给定 n 个点,m 条边的 ...
- python爬虫学习(5) —— 扒一下codeforces题面
上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...
- 【Codeforces 738D】Sea Battle(贪心)
http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...
- 【Codeforces 738C】Road to Cinema
http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...
- 【Codeforces 738A】Interview with Oleg
http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...
- CodeForces - 662A Gambling Nim
http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...
- CodeForces - 274B Zero Tree
http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...
随机推荐
- 使用Word2010发布博客文章
发布博客可以直接在web页面上面编辑,也可以使用客户端编辑,其中客户端支持windows live writer以及word本身的发布博客功能.个人试用后倾向于使用word发布博客文章. 下面的内容转 ...
- C++中的垃圾回收和内存管理
最开始的时候看到了许式伟的内存管理变革系列,看到性能测试结果的时候,觉得这个实现很不错,没有深入研究其实现.现在想把这个用到自己的一个项目中来,在linux下编译存在一些问题,所以打算深入研究一下. ...
- 金中欢乐赛 A题
题目传送门 这道题就贪心.... 正的一坨和负的一坨间隔 #include<cstdio> #include<cstring> #include<algorithm> ...
- nginx启动脚本(class练习)
说明:使用类的方式编写程序启动脚本(练习) 1 #!/usr/bin/env python import sys import os from subprocess import Popen,PIPE ...
- python实战===石头剪刀布,简单模型
#石头剪刀布 import random import time win_list = [("石头","剪刀"),("布","石头 ...
- 【洛谷P1343】地震逃生
一道傻吊的网络流题,wori我写的读入优化怎么老T? 远离读入优化报平安? #include<bits/stdc++.h> #define N 4005 #define inf 10000 ...
- 《Java编程思想》笔记 第九章 接口
1.抽象类和抽象方法 抽象方法,仅有方法声明没有方法体 abstract class AbstractClass{ abstract void f(); //没有 {} } 只要有一个或者多个抽象方法 ...
- k8s的service
1.service简介 本节开始学习 Service.我们不应该期望 Kubernetes Pod 是健壮的,而是要假设 Pod 中的容器很可能因为各种原因发生故障而死掉.Deployment 等 c ...
- k8s创建资源的两种方式
命令 vs 配置文件 Kubernetes 支持两种方式创建资源: 1. 用 kubectl 命令直接创建 kubectl run nginx-deployment --image=nginx: -- ...
- MATLAB求解常微分方程:ode45函数与dsolve函数
ode45函数无法求出解析解,dsolve可以求出解析解(若有),但是速度较慢. 1. ode45函数 ①求一阶常微分方程的初值问题 [t,y] = ode45(@(t,y)y-2*t/y, ...