思路:

先随便建出来一棵搜索树(图可能不连通?)

每一条非树边(剩下的边)和树边都可以构成一个环。

我们只看一个非树边和某些树边构成的这些环。

分成三种情况:

1.没有奇环  所有边都可以删

2.有一个奇环  奇环上的边可以删

3.有一堆奇环,一堆偶环

边化到点上

如果是奇环 非树边为(x,y) 在树上x,y这两个地方+1 lca(x,y)-2

偶环相反

做一遍树上递推上去

最后如果答案和奇环边的数量相等  这个边可以删。

//By SiriusRen
#include <bits/stdc++.h>
using namespace std;
const int N=;
int n,m,xx,yy,v[N],next[N],first[N],tot,num,T,stk[N],a[N],odd,R[N],remm,lastT,
rev[N],fa[N],vis[N],size[N],son[N],dfn[N],cnt,top[N],deep[N],ans,ra[N];
struct Node{int x,y,wei;}rec[N];
void add(int x,int y){v[tot]=y,next[tot]=first[x],first[x]=tot++;}
void dfs1(int x){
size[x]=,vis[x]=,rev[++T]=x,stk[T]=x;
for(int i=first[x];~i;i=next[i])if(v[i]!=fa[x]){
if(vis[v[i]]){rec[++num].x=x,rec[num].y=v[i],rec[num].wei=i/+;continue;}
R[v[i]]=i/+,deep[v[i]]=deep[x]+,fa[v[i]]=x;
dfs1(v[i]),size[x]+=size[v[i]];
if(size[v[i]]>size[son[x]])son[x]=v[i];
}
}
void dfs2(int x,int tp){
vis[x]=,dfn[x]=++cnt;top[x]=tp;
if(son[x])dfs2(son[x],tp);
for(int i=first[x];~i;i=next[i])if(v[i]!=fa[x]&&v[i]!=son[x]&&!vis[v[i]])dfs2(v[i],v[i]);
}
int lca(int x,int y){
int fx=top[x],fy=top[y];
while(fx!=fy){
if(deep[fx]<deep[fy])swap(fx,fy),swap(x,y);
x=fa[fx],fx=top[x];
}if(deep[x]<deep[y])return x;return y;
}
int main(){
memset(first,-,sizeof(first));
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)scanf("%d%d",&xx,&yy),add(xx,yy),add(yy,xx);
for(int i=;i<=n;i++)if(!vis[i]){
dfs1(i);for(int j=lastT;j<=T;j++)vis[rev[j]]=;dfs2(i,i);lastT=T;
}for(int i=;i<=num;i++){
if((deep[rec[i].x]%)==(deep[rec[i].y]%))
a[rec[i].x]++,a[rec[i].y]++,a[lca(rec[i].x,rec[i].y)]-=,odd++,remm=rec[i].wei;
else a[rec[i].x]--,a[rec[i].y]--,a[lca(rec[i].x,rec[i].y)]+=;
}if(!odd){printf("%d\n",m);for(int i=;i<=m;i++)printf("%d ",i);return ;}
for(int i=n;i;i--)a[fa[stk[i]]]+=a[stk[i]];
for(int i=;i<=n;i++)if(a[i]==odd)ra[++ans]=R[i];
if(odd==)ra[++ans]=remm;
printf("%d\n",ans),sort(ra+,ra++ans);
for(int i=;i<=ans;i++)printf("%d ",ra[i]);
}

Codeforces 19E 树上差分的更多相关文章

  1. CF 19E Fairy——树上差分

    题目:http://codeforces.com/contest/19/problem/E 去掉一条边,使无向图变成二分图. 该边应该被所有奇环经过,且不被偶环经过. 因为一条非树边一定只在一个环里. ...

  2. Codeforces E. Alyona and a tree(二分树上差分)

    题目描述: Alyona and a tree time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

  3. [Codeforces 555E]Case of Computer Network(Tarjan求边-双连通分量+树上差分)

    [Codeforces 555E]Case of Computer Network(Tarjan求边-双连通分量+树上差分) 题面 给出一个无向图,以及q条有向路径.问是否存在一种给边定向的方案,使得 ...

  4. XJOI 3363 树4/ Codeforces 739B Alyona and a tree(树上差分+路径倍增)

    D. Alyona and a tree time limit per test  2 seconds memory limit per test  256 megabytes input  stan ...

  5. Codeforces 191C (LCA+树上差分算法)

    题面 传送门 题目大意: 给出一棵树,再给出k条树上的简单路径,求每条边被不同的路径覆盖了多少次 分析 解决这个问题的经典做法是树上差分算法 它的思想是把"区间"修改转化为左右端点 ...

  6. CodeForces 739B Alyona and a tree (二分+树上差分)

    <题目链接> 题目大意: 给定一颗带权树,树的根是1,树上每个点都有点权,并且还有边权.现在给出“控制”的定义:对一个点u,设v为其子树上的节点,且$dis(u,v)≤val[v]$,则称 ...

  7. 算法笔记--树的直径 && 树形dp && 虚树 && 树分治 && 树上差分 && 树链剖分

    树的直径: 利用了树的直径的一个性质:距某个点最远的叶子节点一定是树的某一条直径的端点. 先从任意一顶点a出发,bfs找到离它最远的一个叶子顶点b,然后再从b出发bfs找到离b最远的顶点c,那么b和c ...

  8. 【BZOJ-4326】运输计划 树链剖分 + 树上差分 + 二分

    4326: NOIP2015 运输计划 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 703  Solved: 461[Submit][Status] ...

  9. [luogu P3128][USACO15DEC]Max Flow [LCA][树上差分]

    题目描述 Farmer John has installed a new system of  pipes to transport milk between the  stalls in his b ...

随机推荐

  1. Random和ArrayList的应用

    /*Random类应用与Math类应用,创建一个类, * 1)分别用Random类和Math.random()方法生成随机数. * 2) 把Math.random()方法生成的随机数,转换成1-100 ...

  2. Navicat premium连接Oracle报ORA-12541错误

    1:ORA-12541 原因:Oracle TNS监听服务没开 解决:

  3. EasyUI Datagrid的简单使用

    此前同样写过EasyUI Datagrid的demo,好记性不如烂笔头,何况记性也不是那么好,赶紧记录一下.照搬上一篇EasyUI Tree的格式. 实现效果:获取数据库表的数据,在EasyUI Da ...

  4. MyBatis启动:MapperStatement创建

    参考:http://blog.csdn.net/ashan_li/article/details/50351080 MappedStatement说明 一个MappedStatement对象对应Map ...

  5. nyoj_127_星际之门(一)_201403282033

    星际之门(一) 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 公元3000年,子虚帝国统领着N个星系,原先它们是靠近光束飞船来进行旅行的,近来,X博士发明了星际之门 ...

  6. PageUtil ,简单的分页工具

    public class PageUtil { private int totalCount;//总数 private int pageSize=10;//每页显示数量 private int cur ...

  7. tomcat服务器配置把Http协议强制转化为Https

    1)在命令提示符窗口,进入Tomcat目录,执行以下命令: keytool -genkey -alias tomcat -keyalg RSA -keypass changeit -storepass ...

  8. 多Tabs的横向滚动插件(支持Zepto和jQuery)

    一. 效果图 二. 功能介绍 1. 支持横向移动 2. 支持点击Tab后该Tab居中 3. 拉到最左边和最右边后依然可以拉动,只是tabs的移动距离变小. 三. 使用说明 1. 在你的html中添加T ...

  9. velt-0.1.7开发: KernelConfig的问题

    快乐虾 http://blog.csdn.net/lights_joy/(QQ群:Visual EmbedLinux Tools 375515651) 欢迎转载.但请保留作者信息 VELT的全称是Vi ...

  10. C#之out和ref区别

    out与ref的区别总结:1.两者都是通过引用来传递.2.两者都按地址传递的,使用后都将改变原来参数的数值.3.属性不是变量,因此不能作为 out或ref 参数传递.4.若要使用 ref 或 out, ...