题目: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——树上差分的更多相关文章

  1. CF19 E Fairy——树上差分

    题目:http://codeforces.com/contest/19/problem/E 先把图连成一棵树,然后对于每条非树边,判断它是在奇环中还是偶环中: 把环上的点打上相应的差分标记,并记录有多 ...

  2. CF19E Fairy(树上差分)

    题目描述 很久很久以前,有一个仙女叫做A.有一天一个少年B找到她,并且请求她预测他的未来.仙女看着她的水晶球,说这位少年不久将遇见世界上最美丽的公主,并且将迎娶她为妻.然后仙女在一张纸上画了n个点,并 ...

  3. 【Cf #292 D】Drazil and Morning Exercise(树的直径,树上差分)

    有一个经典的问题存在于这个子问题里,就是求出每个点到其他点的最远距离. 这个问题和树的直径有很大的关系,因为事实上距离每个点最远的点一定是直径的两个端点.所以我们可以很容易地进行$3$遍$Dfs$就可 ...

  4. BZOJ4424/CF19E Fairy(dfs树+树上差分)

    即删除一条边使图中不存在奇环.如果本身就是个二分图当然任意一条边都可以,先check一下.否则肯定要删除在所有奇环的交上的边. 考虑怎么找这些边.跑一遍dfs造出dfs树,找出返祖边构成的奇环.可以通 ...

  5. 暗之的锁链 [COGS2434] [树上差分]

    Description 无向图中有N个节点和两类边,一类边被称为主要边,而另一类被称为附加边.Dark有N – 1条主要边,并且Dark的任意两个节点之间都存在一条只由主要边构成的路径.另外,Dark ...

  6. D6差分及树上差分

    原谅我这篇博客拖了很久才写: 来到学校就和白痴一样缺了一世纪的课 上课特别懵:还有开学考枯了: 差分有列的差分,对于一段区间[l,r]进行修改,显然如果我们对于他的差分数组的l和r+1进行修改就可以了 ...

  7. 【CF739B】Alyona and a tree(树上差分,二分,树形DP)

    题意:给出一棵有根树,树上每个点.每条边都有一个权值. 现在给出“控制”的定义:对一个点u,设点v在其子树上,且dis(u,v)≤av,则称u控制v. 要求求出每个点控制了多少个点 n (1 ≤ n  ...

  8. 洛谷P3258 [JLOI2014]松鼠的新家【LCA+树上差分】

    简要题意 树上n个节点,给定路径,求每个点经过次数 题意分析 对于每两个点,有两种情况,第一种,他们的lca为本身,第二种,他们有公共祖先,又要求他们的点经过次数,暴力是不可能的,复杂度不对,所以可以 ...

  9. luoguP2680 运输计划 题解(二分答案+树上差分)

    P2680 运输计划  题目 这道题如果是看的我的树上差分来的,那么肯定一看题目就可以想到树上差分. 至于这是怎么想到的,一步一步来: 1.n有300000,不可能暴力枚举每一条边 2.因为我们要使运 ...

随机推荐

  1. PHP辅攻_[学习资料收集]PHP连接SQLServer2005方法

    PHP连接SQLServer2005 1.修改php.ini将extension=php_mssql.dll的注释删除保存. 修改php.in将mssql.secure_connection = Of ...

  2. 跨平台移动开发_Windows Phone 8 使用 PhoneGap 方法

    第一步,下载Windows Phone SDK 8.0 http://www.microsoft.com/zh-cn/download/details.aspx?id=35471 离线下载地址(推荐使 ...

  3. PHP面试题 – 培训学校真实面试内部资料

    1.PHP解析URL是哪个函数? parse_url() 是讲URL解析成有固定键值的数组的函数. $ua=parse_url('http://username:password@hostname/p ...

  4. java写出图形界面

    1. 做出简单的窗体 package javaGUI; import java.awt.BorderLayout; import java.awt.Color; import javax.swing. ...

  5. android.intent.category.LAUNCHER和android.intent.action.MAIN

    一个应用程序可以有多个Activity,每个Activity是同级别的,那么在启动程序时,最先启动哪个Activity呢? 有些程序可能需要显示在程序列表里,有些不需要.怎么定义呢? android. ...

  6. 研究Mac OS中Migration Assistant工具

    一.对Migration Assistant工具的理解: 1.最精辟的定义是:Move your content to a new Mac. 如果想将windows上的数据迁移到mac上?使用工具Wi ...

  7. HDFS文件访问权限

    HDFS中的文件访问权限 针对文件和目录,HDFS的权限模式与POSIX非常相似一共提供三类权限模式:只读权限(r).写入权限(w)和可执行权限(x).读取文件或列出目录内容时需要只读权限.写入一个文 ...

  8. EXTJS4.2 级联 下拉

    items: [ { xtype: "fieldcontainer", layout: "hbox", items: [{ xtype: 'combo', na ...

  9. mssql 函数STUFF 的用法

    DECLARE @limitDay INT;SET @limitDay = 92;IF DATEDIFF(DAY, '2017-12-13 00:00:00', '2017-12-13 18:00:0 ...

  10. UOJ66 新年的巧克力棒

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...