CF 19E Fairy——树上差分
题目:http://codeforces.com/contest/19/problem/E
去掉一条边,使无向图变成二分图。
该边应该被所有奇环经过,且不被偶环经过。
因为一条非树边一定只在一个环里。所以一条既被所有奇环经过又被偶环经过的边是树边。如果把它去掉,将无法处理包含它的那个偶环的非树边和包含它的某个奇环的非树边加上两段树边所构成的奇环。
找这样的边,弄一个边上的树上差分就行了。
可以模仿kruscal用并查集弄一个生成树。不过dfs其实也行。
注意图可能不连通。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e4+;
int n,m,c[N][],fa[N],head[N],t[N<<],next[N<<],tot;
int hd[N],xnt,col[N],cnt,pa[N],prbh,bh[N<<],q[N],qnt;
bool vis[N];
struct Ed{
int nxt,to,bh;Ed(int n=,int t=,int b=):nxt(n),to(t),bh(b) {}
}ed[N<<];
int find(int a){return fa[a]==a?a:fa[a]=find(fa[a]);}
void add(int x,int y,int b)
{
ed[++xnt]=Ed(hd[x],y,b);hd[x]=xnt;
ed[++xnt]=Ed(hd[y],x,b);hd[y]=xnt;
}
void dfs(int cr,int f)
{
vis[cr]=;
for(int i=head[cr],v;i;i=next[i])
if(col[v=t[i]])
{
int f0=find(v),d=(col[cr]==col[v]);
if(d){cnt++;if(cnt==)prbh=bh[i];}
c[cr][d]++;c[v][d]++;c[f0][d]-=;
}
for(int i=hd[cr];i;i=ed[i].nxt)
if(ed[i].to!=f)
{
col[ed[i].to]=-col[cr];dfs(ed[i].to,cr);
}
fa[cr]=f;
}
void dfsx(int cr,int f,int eb)
{
vis[cr]=;
for(int i=hd[cr],v;i;i=ed[i].nxt)
if((v=ed[i].to)!=f)
{
dfsx(v,cr,ed[i].bh);
c[cr][]+=c[v][];c[cr][]+=c[v][];
}
if(c[cr][]==cnt&&!c[cr][])q[++qnt]=eb;
}
int main()
{
scanf("%d%d",&n,&m);int x,y;
for(int i=;i<=n;i++)fa[i]=i;
for(int i=;i<=m;i++)
{
scanf("%d%d",&x,&y);
if(find(x)!=find(y))
{
add(x,y,i);
fa[find(x)]=find(y);
}
else{
t[++tot]=y;next[tot]=head[x];head[x]=tot;bh[tot]=i;
t[++tot]=x;next[tot]=head[y];head[y]=tot;bh[tot]=i;
}
}
for(int i=;i<=n;i++)fa[i]=i;
for(int i=;i<=n;i++) if(!vis[i])
col[i]=,dfs(i,);
if(!cnt)
{
printf("%d\n",m);
for(int i=;i<=m;i++)printf("%d ",i);return ;
}
if(cnt==)q[++qnt]=prbh;
memset(vis,,sizeof vis);
for(int i=;i<=n;i++) if(!vis[i])dfsx(i,,);
sort(q+,q+qnt+);
printf("%d\n",qnt);
for(int i=;i<=qnt;i++)printf("%d ",q[i]);
return ;
}
CF 19E Fairy——树上差分的更多相关文章
- CF19 E Fairy——树上差分
题目:http://codeforces.com/contest/19/problem/E 先把图连成一棵树,然后对于每条非树边,判断它是在奇环中还是偶环中: 把环上的点打上相应的差分标记,并记录有多 ...
- CF19E Fairy(树上差分)
题目描述 很久很久以前,有一个仙女叫做A.有一天一个少年B找到她,并且请求她预测他的未来.仙女看着她的水晶球,说这位少年不久将遇见世界上最美丽的公主,并且将迎娶她为妻.然后仙女在一张纸上画了n个点,并 ...
- 【Cf #292 D】Drazil and Morning Exercise(树的直径,树上差分)
有一个经典的问题存在于这个子问题里,就是求出每个点到其他点的最远距离. 这个问题和树的直径有很大的关系,因为事实上距离每个点最远的点一定是直径的两个端点.所以我们可以很容易地进行$3$遍$Dfs$就可 ...
- BZOJ4424/CF19E Fairy(dfs树+树上差分)
即删除一条边使图中不存在奇环.如果本身就是个二分图当然任意一条边都可以,先check一下.否则肯定要删除在所有奇环的交上的边. 考虑怎么找这些边.跑一遍dfs造出dfs树,找出返祖边构成的奇环.可以通 ...
- 暗之的锁链 [COGS2434] [树上差分]
Description 无向图中有N个节点和两类边,一类边被称为主要边,而另一类被称为附加边.Dark有N – 1条主要边,并且Dark的任意两个节点之间都存在一条只由主要边构成的路径.另外,Dark ...
- D6差分及树上差分
原谅我这篇博客拖了很久才写: 来到学校就和白痴一样缺了一世纪的课 上课特别懵:还有开学考枯了: 差分有列的差分,对于一段区间[l,r]进行修改,显然如果我们对于他的差分数组的l和r+1进行修改就可以了 ...
- 【CF739B】Alyona and a tree(树上差分,二分,树形DP)
题意:给出一棵有根树,树上每个点.每条边都有一个权值. 现在给出“控制”的定义:对一个点u,设点v在其子树上,且dis(u,v)≤av,则称u控制v. 要求求出每个点控制了多少个点 n (1 ≤ n ...
- 洛谷P3258 [JLOI2014]松鼠的新家【LCA+树上差分】
简要题意 树上n个节点,给定路径,求每个点经过次数 题意分析 对于每两个点,有两种情况,第一种,他们的lca为本身,第二种,他们有公共祖先,又要求他们的点经过次数,暴力是不可能的,复杂度不对,所以可以 ...
- luoguP2680 运输计划 题解(二分答案+树上差分)
P2680 运输计划 题目 这道题如果是看的我的树上差分来的,那么肯定一看题目就可以想到树上差分. 至于这是怎么想到的,一步一步来: 1.n有300000,不可能暴力枚举每一条边 2.因为我们要使运 ...
随机推荐
- finally中的return
周五晚6点下班去面试,出了一份笔试题,看到第一题有些蒙了,虽然以前遇到过类似的问题,但并没有留心记一下,觉得没人会这样写代码,但实际上没有面试题中是有的. 1,有在try块中执行不到finally的情 ...
- MySQL数据库基本操作(二)
表结构操作 ( ALTER TABLE) 添加单列: ALTER TABLE tb1_name ADD [COLUNM] col_name column_definition [FIRST|AFTER ...
- EF Code-First 学习之旅 Code First Conventions
协定是一系列的默认规则用来自动配置领域中的概念模型 1:类型发现 Code-First对包含DBSet属性的类型创建表(包括这些类型的所有引用类型) public class Student { pu ...
- UVA 11731 Ex-circles (外切圆)
题意:给你三角形的三条边,求图中DEF的面积和阴影部分的面积. 题解:一些模板,三角形的旁切圆半径:.与 三旁心为 #include<set> #include<map> #i ...
- eclipse安装hibernate插件(在线Marketplace中安装)
网上很多都是给个网址,然后在eclipse的help中new install soft中安装.每次安装还要去查找最新的地址去安装.为什么不用eclipse的marketplace直接搜索安装呢? 打开 ...
- struts2常见配置解决错误There is no mapped for namespace[/] and action name
我碰到这个错误的原因是我把配置文件名写成了Struts.xml,改成struts.xml就可以了. 在确定struts.xml本身并没有写错的情况下,那么发生错误有可能是路径,配置文件名. 如果实在找 ...
- spring boot: @EnableScheduling开启计划任务支持,@Scheduled计划任务声明
spring boot: @EnableScheduling开启计划任务支持, @Scheduled计划任务声明 package ch2.scheduler2; //日期转换方式 import jav ...
- java:Writer/Reader字符流操作
字符流的操作: 字节流的操作,是直接映射文件的:file->文件 字符流的操作是需要存在缓存区的:file->缓冲区->文件 (中文处理,一般用字符流) public static ...
- WPF TextBox 只能输入数字键
<Grid> <TextBox Name="textBox1" PreviewTextInput="textBox1_PreviewT ...
- Ajax-快速上手前后端交互
Ajax 在之前自己也有总结过关于Ajax的笔记,各种的懵圈,通过一次项目和几次的总结和分享,我对Ajax终于算是有了一定的理解和自己的见解.相信大家见过和度过了很多的关于Ajax的什么前世今生.大刀 ...