Codeforces 19E 树上差分
思路:
先随便建出来一棵搜索树(图可能不连通?)
每一条非树边(剩下的边)和树边都可以构成一个环。
我们只看一个非树边和某些树边构成的这些环。
分成三种情况:
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 树上差分的更多相关文章
- CF 19E Fairy——树上差分
题目:http://codeforces.com/contest/19/problem/E 去掉一条边,使无向图变成二分图. 该边应该被所有奇环经过,且不被偶环经过. 因为一条非树边一定只在一个环里. ...
- Codeforces E. Alyona and a tree(二分树上差分)
题目描述: Alyona and a tree time limit per test 2 seconds memory limit per test 256 megabytes input stan ...
- [Codeforces 555E]Case of Computer Network(Tarjan求边-双连通分量+树上差分)
[Codeforces 555E]Case of Computer Network(Tarjan求边-双连通分量+树上差分) 题面 给出一个无向图,以及q条有向路径.问是否存在一种给边定向的方案,使得 ...
- 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 ...
- Codeforces 191C (LCA+树上差分算法)
题面 传送门 题目大意: 给出一棵树,再给出k条树上的简单路径,求每条边被不同的路径覆盖了多少次 分析 解决这个问题的经典做法是树上差分算法 它的思想是把"区间"修改转化为左右端点 ...
- CodeForces 739B Alyona and a tree (二分+树上差分)
<题目链接> 题目大意: 给定一颗带权树,树的根是1,树上每个点都有点权,并且还有边权.现在给出“控制”的定义:对一个点u,设v为其子树上的节点,且$dis(u,v)≤val[v]$,则称 ...
- 算法笔记--树的直径 && 树形dp && 虚树 && 树分治 && 树上差分 && 树链剖分
树的直径: 利用了树的直径的一个性质:距某个点最远的叶子节点一定是树的某一条直径的端点. 先从任意一顶点a出发,bfs找到离它最远的一个叶子顶点b,然后再从b出发bfs找到离b最远的顶点c,那么b和c ...
- 【BZOJ-4326】运输计划 树链剖分 + 树上差分 + 二分
4326: NOIP2015 运输计划 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 703 Solved: 461[Submit][Status] ...
- [luogu P3128][USACO15DEC]Max Flow [LCA][树上差分]
题目描述 Farmer John has installed a new system of pipes to transport milk between the stalls in his b ...
随机推荐
- 深入理解PHP之foreach
招聘 标签(空格分隔): 招聘 PHP 国贸 语言基础 foreach 语法结构提供了遍历数组的简单方式. php5之前, foreach仅能用于数组php5+, 利用foreach可以遍历对象 fo ...
- git 连接github.com 并配置密钥
传送门:http://www.jianshu.com/p/ff1034ed270e #备份ssh cd ~/.ssh $ ls $ mkdir key_backup //创建备份文件夹 $ cp id ...
- Swift 对象创建(PUT Object)过程详解——基于副本策略(一)
swift中创建对象,即PUT object,根据选定的存储策略将对象内容写入至相应的服务器(object server).我们重点关注object controller和object servers ...
- nyoj_600_花儿朵朵_201404162000
花儿朵朵 时间限制:1000 ms | 内存限制:65535 KB 难度:5 描述 春天到了,花儿朵朵盛开,hrdv是一座大花园的主人,在他的花园里种着许多种鲜花,每当这个时候,就会有一大群游 ...
- 演练:使用VS2010 C# 创作简单的多线程组件
BackgroundWorker 组件取代了 System.Threading 命名空间并添加了功能:但是,可以选择保留 System.Threading 命名空间以实现向后兼容并供将来使用.有关更多 ...
- POJ 2104 K-th Number(区间第k大数)(平方切割,归并树,划分树)
题目链接: http://poj.org/problem? id=2104 解题思路: 由于查询的个数m非常大.朴素的求法无法在规定时间内求解. 因此应该选用合理的方式维护数据来做到高效地查询. 假设 ...
- 微信企业号开发:corpsecret究竟在哪块呢?
开发微信企业号,获取ACCESS_TOKEN是必须的,但怎样获取ACCESS_TOKEN呢? 获取access_token=ACCESS_TOKEN" style="text-de ...
- 第十五周oj刷题——Problem M: C++习题 矩阵求和--重载运算符
Description 有两个矩阵a和b,均为2行3列.求两个矩阵之和.重载运算符"+",使之能用于矩阵相加(如c=a+b). 重载流插入运算符"<<&quo ...
- PhoneGap3+版本号的安装、配置和使用[图]
如若转载.请注明博文地址及原作者(RisingWonderland). PhoneGap2+版本号最高为2.9.1,从3+版本号開始,PhoneGap官方不再提供下载安装包,须要在联网状态下.通过No ...
- iOS开发之剖析"秘密"App内容页面效果(一)
近期在玩"秘密",发现点击主界面的Cell进去后的页面效果不错,就写了个Demo来演示下. 它主要效果:下拉头部视图放大,上拉视图模糊并且到一定位置固定不动,其它Cell能够继续上 ...