思路:

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

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

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

分成三种情况:

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. XML中的特殊(保留)字符数据

    XML中的特殊(保留)字符数据 制作人:全心全意 在XML文档中,有些字符会被XML解析器当作标记进行处理.如果希望把这些字符作为普通字符处理,就需要使用实体引用或CDATA段. 使用实体引用 为了避 ...

  2. 53.doc value机制内核级原理深入探秘

    主要知识点: doc value的原理 doc value性能优化     一.doc value原理     1. 生成时间:index-time生成     PUT/POST的时候,就会生成doc ...

  3. 18年多校-1002 Balanced Sequence

    >>点击进入原题测试<< 思路:自己写没写出来,想不通该怎么排序好,看了杜神代码后补题A掉的.重新理解了一下优先队列中重载小于号的含义,这里记录一下这种排序方式. #inclu ...

  4. Ajax_使用 jQuery 实现Ajax

    [jQuery中的Ajax] 1.jQuery对Ajax操作进行了封装,在jQuery中最底层的方法时 $.ajax().第二层是 load() , $.get()  和 $.post(),第三层是 ...

  5. nyoj 1112 求次数(map, set)

    求次数 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 题意很简单,给一个数n 以及一个字符串str,区间[i,i+n-1] 为一个新的字符串,i 属于[0,strl ...

  6. POJ 3630

    Phone List Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 20894 Accepted: 6532 Descripti ...

  7. hdu 3062 2-sat

    #include<stdio.h> #include<string.h> #define N 2100 struct node { int u,v,next; }bian[N* ...

  8. 转载 - C - 枚举类型详解

    出处:http://www.cnblogs.com/JCSU/articles/1299051.html 注:以下全部代码的执行环境为VC++ 6.0 在程序中,可能需要为某些整数定义一个别名,我们可 ...

  9. 回文质数 USACO

    时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 15 ...

  10. 二叉堆练习3&【模板】堆

    时间限制: 3 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 给定N(N≤500,000)和N个整数(较有序),将其排序后输出. 输入描述 Inp ...