#题意#
给出一个无向图,问有多少条边满足存在一种黑白染色方案,使得有且仅有该边连接两个同颜色的点。
n<=105,m<=2*105

#分析#
按照套路我们要先把dfs树搞出来,然后讨论一波。
我们把点按照深度的奇偶性来染色,设那些连接相同颜色的边为垃圾边,然后开始讨论。
若没有垃圾边,那么原图是一个二分图,我们就只能删那些割边。
若存在垃圾边的话,如果只有一条垃圾边,那么我们可以删掉这条垃圾边,反之则不能删垃圾边。接下来我们要使所有垃圾边两端的颜色不同,那么就只能删那些在所有垃圾边交集上且不被非垃圾边覆盖的边。
求边交集和非垃圾边覆盖数量可以用树上差分来搞。

#代码#

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;const int N=100005;int n,m,cnt,last[N],dep[N],fa[N],val[N],s,p1,p2,w[N];
bool vis[N];
struct edge{int to,next;}e[N*4];int read()
{int x=0,f=1;char ch=getchar();while (ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}void addedge(int u,int v)
{e[++cnt].to=v;e[cnt].next=last[u];last[u]=cnt;e[++cnt].to=u;e[cnt].next=last[v];last[v]=cnt;
}void dfs(int x,int from)
{vis[x]=1;for (int i=last[x];i;i=e[i].next){if (i==(from^1)) continue;if (!vis[e[i].to]){dep[e[i].to]=dep[x]+1;fa[e[i].to]=x;dfs(e[i].to,i);val[x]+=val[e[i].to];w[x]+=w[e[i].to];}else{if (dep[e[i].to]>dep[x]) continue;if (dep[e[i].to]%2==dep[x]%2) s++,p1=e[i].to,p2=x,w[e[i].to]--,w[x]++;else val[x]++,val[e[i].to]--;}}
}int main()
{n=read();m=read();cnt=1;for (int i=1;i<=m;i++){int x=read(),y=read();addedge(x,y);}for (int i=1;i<=n;i++) if (!vis[i]) dfs(i,0);int ans=0;if (!s){for (int i=2;i<=n;i++) if (!val[i]&&fa[i]) ans++;}else{if (s==1) ans++;while (p2!=p1){if (!val[p2]&&w[p2]==s) ans++;p2=fa[p2];}}printf("%d",ans);return 0;
}

bzoj 4238: 电压 dfs树相关推荐

  1. BZOJ 4238 电压 解题报告

    BZOJ 4238 电压 考虑一条边成为答案以后,删去Ta后剩下的图是一个或很多个二分图,即没有奇环 则一条边可以成为答案,当且仅当自己在所有奇环的交上且不在偶环上. 考虑建出dfs树,那么返祖边一定 ...

  2. 图论 ---- E. Pairs of Pairs(构造+无向图的dfs树的性质)

    题目链接 题目大意: 题目解法: 首先我们先对这个图求一个dfs树dfs树dfs树,那么对dfs树dfs树dfs树求树的直径rrr如果⌈n2⌉≤r\lceil\frac{n}{2}\rceil\leq ...

  3. 图论 ---- 构造DFS树的思想 K - Boomerangs Gym - 102001K

    题目链接 题目大意: 解题思路: 启发性思考首先我们先图切成dfs树,然后给图一个稳定结构之后,我们就可以去构造了 对于每个点我们从第底端开始构造每次把每次点的儿子两两匹配,如果是奇数个儿子就把多出来 ...

  4. Luogu P1198 BZOJ 1012 最大数 (线段树)

    Luogu P1198 BZOJ 1012 最大数 (线段树) 手动博客搬家: 本文发表于20170821 14:32:05, 原地址https://blog.csdn.net/suncongbo/a ...

  5. Last Theorem CodeForces - 1325F(dfs树找最大环+思维)

    It's the year 5555. You have a graph, and you want to find a long cycle and a huge independent set, ...

  6. Codeforces Round #628 (Div. 2) F. Ehab‘s Last Theorem dfs树

    传送门 文章目录 题意: 思路: 题意: 给你个nnn个点mmm条边的图,可以选择完成以下两个任务中的一个: (1)(1)(1)找出大小恰好为n\sqrt nn​的一个独立集. (2)(2)(2)找出 ...

  7. 图论复习——dfs树,点双,边双,强连通分量

    知识点 dfs树 对一个图运行 dfs 算法,每个点uuu的父亲定义为第一次遍历uuu时的前驱结点,若无则为根. 无向图的 dfs树 没有横叉边. 有向图的 dfs树 横叉边方向唯一,总是从后访问的点 ...

  8. CF732F Tourist Reform(dfs树、边双连通图、tarjan)

    因为知道了算法tag,所以想到了正解: 先给出两个性质: 边双给边定向一定可以转为强连通图,此为最优解 树给边定向后R的最小值必为0 性质2证明如下: 设树有n个节点, 若R_min!=0, 则每点出 ...

  9. [XSY] 分割(dfs树)

    分割 题目相当于问 删掉两个点后 图是否仍然连通 割点问题,考虑用dfs树解决 设删去点u,v(dfn[v]<dfn[u]) 把 u, v 删去之后整棵树大概断成了几个部分: • v 上面到根的 ...

  10. [dfs树]「CEOI 2017」One-Way Streets

    不难的题.首先任意环上的边一定不是必经边,答案为B.我们随便搞一颗原图的dfs树,那么非树边,和每条飞树边覆盖的树上的链都是B.在树上打链覆盖的标记即可. 然后是对于每个x到y有路的限制,我们直接在x ...

最新文章

  1. python asyncio文件操作_Python asyncio文档阅读摘要
  2. 台式计算机风扇一直响,风扇一直响的原因是什么? 处理方法
  3. FreeSql使用WithSql+ ToSQL 查询数据
  4. Python3.8 了解的差不多了吧,Python3.9 新特性了解一下!
  5. 一种真正意义上的Session劫持
  6. 如何在Linux桌面环境下自动启动程序?
  7. linux命令行可以看图片吗,活久见!Linux命令行居然也可以用来查看图像?
  8. SparkContext详述
  9. python与excel-Python与Excel之间的交互
  10. 第4章 URL管理器和实现方法
  11. go语言--正则表达式过滤数据--通过文件获取数据
  12. Java中日期格式化yyyyMMdd和YYYYMMdd的区别
  13. GitLab安装并设置为开机启动
  14. orcale中like用法详解
  15. ns3 学习资料和方法
  16. 有助于睡眠的15首歌曲,听着最容易入睡的歌曲推荐
  17. python超声成像仿真_平面波超声成像(Filed II仿真代码)
  18. 计算机中,为什么一个字节是8位?
  19. html代码在线压缩成一行,HTML压缩 - Hito's Blog
  20. 采药问题 c语言程序,采药-动态规划题解(C语言代码)

热门文章

  1. Au 效果器详解:自适应降噪
  2. 山东济南计算机比赛,第十二届齐鲁软件大赛及首届济南市计算机科技奖颁奖盛典举行...
  3. 击穿面试官的套路:经典面试问题剖析
  4. idea项目误删恢复
  5. 14种鼻型图解_十种鼻型分类图解
  6. FPGA开发第四弹:触摸按键控制LED灯实验
  7. Java问卷调查管理系统(附数据库)
  8. java 主项目 子项目_java web项目自动管理子项目,以及子项目打包
  9. “移动互联网+”第一股 正益移动登陆新三板
  10. python判断闰年和平年