思路:

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

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

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

分成三种情况:

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

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

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

边化到点上

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

偶环相反

做一遍树上递推上去

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

//By SiriusRen
#include <bits/stdc++.h>
using namespace std;
const int N=20050;
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]=1,vis[x]=1,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/2+1;continue;}R[v[i]]=i/2+1,deep[v[i]]=deep[x]+1,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]=1,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,-1,sizeof(first));scanf("%d%d",&n,&m);for(int i=1;i<=m;i++)scanf("%d%d",&xx,&yy),add(xx,yy),add(yy,xx);for(int i=1;i<=n;i++)if(!vis[i]){dfs1(i);for(int j=lastT;j<=T;j++)vis[rev[j]]=0;dfs2(i,i);lastT=T;}for(int i=1;i<=num;i++){if((deep[rec[i].x]%2)==(deep[rec[i].y]%2))a[rec[i].x]++,a[rec[i].y]++,a[lca(rec[i].x,rec[i].y)]-=2,odd++,remm=rec[i].wei;else a[rec[i].x]--,a[rec[i].y]--,a[lca(rec[i].x,rec[i].y)]+=2;}if(!odd){printf("%d\n",m);for(int i=1;i<=m;i++)printf("%d ",i);return 0;}for(int i=n;i;i--)a[fa[stk[i]]]+=a[stk[i]];for(int i=1;i<=n;i++)if(a[i]==odd)ra[++ans]=R[i];if(odd==2)ra[++ans]=remm;printf("%d\n",ans),sort(ra+1,ra+1+ans);for(int i=1;i<=ans;i++)printf("%d ",ra[i]);
}

转载于:https://www.cnblogs.com/SiriusRen/p/9281683.html

Codeforces 19E 树上差分相关推荐

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

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

  2. Codeforces 19E DFS 树

    题意 传送门 Codeforces 19E Fairy 题解 若图中不存在非二分图的连通分量,则任意一边删除后仍是二分图:若图中存在大于一个非二分图的连通分量,则不可能通过删除一条边使之变为二分图.故 ...

  3. CF1707C - DFS Trees (树上差分)

    题意:每次优先按权重最小的边dfs,不重复搜一个节点,问从那些点作为根节点搜索得到的路径与最小生成树一样? Problem - C - Codeforces 思路见官方题解 Codeforces Ro ...

  4. BZOJ4424 Cf19E Fairy(codeforces 19E/洛谷CF19E)

    树上差分 DFS BZOJ题目传送门 codeforces题目传送门 洛谷题目传送门 首先只有当图中没有奇环时一张图才能够二分图染色.因为只允许删一条边,那么答案就是所有奇环的交,并且奇环不能和偶环有 ...

  5. 解题报告:AcWing 352. 闇の連鎖(树上差分、方案统计)

    https://www.acwing.com/problem/content/354/ 在没有附加边的情况下,我们发现这是一颗树,那么再添加条附加边(x,y)后,会造成(x,y)之间产生一个环 如果我 ...

  6. 模板 - LCA最近公共祖先(倍增法、Tarjan、树上差分、LCA优化的次小生成树)

    整理的算法模板合集: ACM模板 注意x和y的LCA可以是x或者y本身 一.LCA的在线倍增算法 /*给定一棵包含 n个节点的有根无向树,有 m个询问,每个询问 给出了一对节点的编号 x和 y,询问 ...

  7. [NOIP 2015]运输计划-[树上差分+二分答案]-解题报告

    [NOIP 2015]运输计划 题面: A[NOIP2015 Day2]运输计划 时间限制 : 20000 MS 空间限制 : 262144 KB 问题描述 公元 2044 年,人类进入了宇宙纪元. ...

  8. 洛谷P2680 运输计划(倍增LCA + 树上差分 + 二分答案)

    [题目链接] [思路]: 根据题意可以明显看出,当所有任务都完成时的时间是最终的结果,也就是说本题要求,求出最小的最大值. 那这样的话就暗示了将答案二分,进行check. [check方法]: 如果说 ...

  9. 差分数组 and 树上差分

    差分数组 定义 百度百科中的差分定义 //其实这完全和要讲的没关系 qwq 进去看了之后是不是觉得看不懂? 那我简单概括一下qwq 差分数组de定义:记录当前位置的数与上一位置的数的差值. 栗子 容易 ...

  10. BZOJ4771 七彩树(dfs序+树上差分+主席树)

    考虑没有深度限制怎么做.显然的做法是直接转成dfs序上主席树,但如果拓展到二维变成矩形数颜色数肯定没法做到一个log. 另一种做法是利用树上差分.对于同种颜色的点,在每个点处+1,dfs序相邻点的lc ...

最新文章

  1. Vue安装配置以及入门案例
  2. Java 获取本机IP和Mac以及网卡信息
  3. OpenGL创建窗口
  4. 排序算法有哪些_超强整理,科班算法岗的秋招之路
  5. 2003年以来网页尺寸增长3倍
  6. C++(5)--运算符、表达式、条件结构(if, switch)
  7. 程序员作图工具和技巧,你 get 了么?
  8. 图解Kafka,一看就明白!
  9. 三、Arcgis api js -- 图形管理 Layer
  10. 高并发高可用系统的常见应对策略
  11. 《零基础入门深度学习》解读
  12. Atitit.并发测试解决方案(2) -----获取随机数据库记录 随机抽取数据 随机排序 原理and实现
  13. jQuery源码分析系
  14. 自己写了个磁力链搜索引擎
  15. 基于深度学习的3D pose estimation总结(包括几篇2D pose estimation)
  16. 10.8.8.8柠檬wifi网页登录_20.5.24—0元Kindle补货了!速度上车!
  17. TOMCAT原理详解及请求过程
  18. (文献随笔)肿瘤浸润的活化B细胞抑制结直肠癌的肝转移(Cell Report, 2022年8月30日)
  19. 向下取整符号_22. 为什么 Python 中的整除是向下取整?
  20. Vs2010安装svn

热门文章

  1. nc文件服务器配置教程,nc文件服务器配置
  2. angular同源策略禁止读取_Redis5.0数据淘汰策略详解(最新版本,面试常问)
  3. Oracle作业5——多表查询、子查询
  4. 百练OJ:2799浮点数格式
  5. SpringRMI解析2-RmiServiceExporter逻辑脉络
  6. 相似图片搜索的原理(二)(转)
  7. delphi相关文件扩展名
  8. C# Winform关于控件TabControl闪烁的问题
  9. MySQL中文参考手册--8.MySQL教程--8.3 常用查询的例子
  10. spring security 使用 application/json 接收数据