LINK:电压

一张图 每个点可以为黑点或百点 每一条边的两端都必须为一黑一白。询问又多少条边满足除了这条边不满足条件其余所有边都满足条件。

分析一下这个所谓的条件 每一条边的两端必须为一黑一白 所以存在奇环是不被允许的。除此之外的任何条件都是满足的。

至于求答案 可以分析 如果不存在奇环 那么显然偶环上的边 我们也删不掉 所以数量为不是环上的边均可。

考虑存在奇环 那么必然是所有奇环的并集的边的数量。

对于第一种情况 可以求一下边双。对于第二种情况我不太会。。

好吧想的有点复杂了 其实判断环的奇偶 dfs即可利用dfs树可以发形成环的边都是返祖边我们在边返祖的时候借用两点的深度之差即可判断出是奇环还是偶环。

但是这种判环方法有点怪 怎么说呢 大环的奇偶性可以判断出来小环的奇偶性不一定能够体现出来。但是同时小环的奇偶性也同时是不必要的。

首先 我们把dfs树给求出来 然后 加入返祖边 此时我们可以判断出来由返祖边形成的环的奇偶性。

但是我们无法判断 出两条返祖边形成的环 不过也不可能判断出来因为环的个数过多我们不可能数的过来。

可以证明那些小环不必要 因为对于小环形成的奇环来说 我们定义返祖边为奇环的一部分 而奇环和奇环的交集也恰好为其中的一条返祖边。

总而言之 我们只需要判断大环 小环是不必要的 大环就可以决定每条边的所属 不妨考虑形成了一个大的偶环。

那么现在所有边都删不掉了 接下来偶环的并上一个奇环 那么至少有两个奇环 而我们的返祖边就被认定为指定的交集。

不胡言乱语了 dfs树建出 进行树上差分,判断奇环和偶环的个数分别覆盖了每个点多少次 根据次数判断。

至于返祖边形成的额外的奇环或偶环 对答案没有任何影响。(这一点我证明不了。。

值得注意的是 如果判断出只有一个奇环存在 那么那条返祖边一定为交集 对答案贡献+1 反之 多个奇环存在那么返祖边不可能为交集。

用dfs树来判环 这一点值得学习。

const int MAXN=100010;
int n,m,len=1,sum,ans;
int d[MAXN],c[MAXN],s1[MAXN],s2[MAXN];
int lin[MAXN],ver[MAXN<<2],nex[MAXN<<2],mark[MAXN<<2];
inline void add(int x,int y)
{
ver[++len]=y;nex[len]=lin[x];lin[x]=len;
ver[++len]=x;nex[len]=lin[y];lin[y]=len;
}
inline void dfs(int x)
{
for(int i=lin[x];i;i=nex[i])
{
int tn=ver[i];
if(!d[tn])mark[i]=1,d[tn]=d[x]+1,dfs(tn);
else
{
if(d[tn]&&!mark[i^1]&&d[x]>d[tn])
{
if((d[x]-d[tn])&1)++s2[x],--s2[tn];
else ++s1[x],--s1[tn],++sum;
}
}
}
}
inline void dp(int x)
{
for(int i=lin[x];i;i=nex[i])
{
int tn=ver[i];
if(mark[i])dp(tn),s1[x]+=s1[tn],s2[x]+=s2[tn];
}
if(d[x]!=1&&s1[x]==sum&&!s2[x])++ans;
}
int main()
{
freopen("1.in","r",stdin);
n=read();m=read();
rep(1,m,i)add(read(),read());
rep(1,n,i)
{
if(d[i])continue;
d[i]=1;dfs(i);
}
if(sum==1)++ans;
rep(1,n,i)if(d[i]==1)dp(i);
put(ans);
return 0;
}

怎么说呢 dfs树高深莫测 不对。

我再重述一遍这一道题的 关键点 推论1:随便构造出来一棵dfs树 剩下的返祖边对答案的贡献最多为1.

证明:如果某条返祖边构成的是偶环 那么不对答案进行贡献 考虑构成一个奇环 首先我们提到了只有奇环的并集才有价值。

如果我们发现奇环数量为2 那么显然这两个奇环 分别由两个返祖边及树边构成 显然存在两个奇环了 那么剩下所有的返祖边都失去了对答案贡献的能力。

考虑只出现了一个奇环 那么由一条返祖边构成这个奇环 这条返祖尽管可能被若干个小环围住 但是始终是交集 且对答案贡献为1.证毕。

接下来我们考虑 树边 对于形成的偶环 覆盖树边 形成的奇环覆盖的树边我们分别统计标记 进行树上差分即可。

考虑小环对树边的影响如果是偶环内套奇环或偶环那么如论如何奇环都不会偶环的这些树边带来影响。

考虑奇环里套偶环 显然还是偶环的边不必要 且可以发现 此时除了偶环上的边其余边为一个小奇环和外面大奇环的交集 我们采用标记法正确。

考虑奇环里套奇环 对于小环为偶环 我们标记显然不成立 剩下的都成立因为那些边即为交集 且标记也成立。

综上所有情况 我们只把dfs树拉出来采用标记的做法正确 不需要考虑到所有环的影响。

bzoj 4238 电压的更多相关文章

  1. BZOJ 4238 电压 解题报告

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

  2. BZOJ 4238: 电压 DFS树

    分类讨论一下奇环和偶环的情况. code: #include <bits/stdc++.h> #define N 200006 #define setIO(s) freopen(s&quo ...

  3. BZOJ 4236~4247 题解

    BZOJ 4236 JOIOJI f[i][0..2]表示前i个字符中′J′/′O′/′I′的个数 将二元组<f[i][0]−f[i][1],f[i][1]−f[i][2]>扔进map,记 ...

  4. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  5. 树形dp专题总结

    树形dp专题总结 大力dp的练习与晋升 原题均可以在网址上找到 技巧总结 1.换根大法 2.状态定义应只考虑考虑影响的关系 3.数据结构与dp的合理结合(T11) 4.抽直径解决求最长链的许多类问题( ...

  6. dfs树

    dfs树是解决图中带环的利器. 前天CF的F题就是dfs树,但是当时我没有认真思考 觉着找到一个环过于困难 当时没有想到 也没理解dfs树的意义. 对于一张无向图求出一个dfs树 这个树有两种边 树边 ...

  7. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

  8. BZOJ 3275: Number

    3275: Number Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 874  Solved: 371[Submit][Status][Discus ...

  9. BZOJ 2879: [Noi2012]美食节

    2879: [Noi2012]美食节 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1834  Solved: 969[Submit][Status] ...

随机推荐

  1. 升降梯上——玄学dp

    升降梯上 题目描述 开启了升降梯的动力之后,探险队员们进入了升降梯运行的那条竖直的隧道,映入眼帘的是一条直通塔顶的轨道.一辆停在轨道底部的电梯.和电梯内一杆控制电梯升降的巨大手柄. \(Nescafe ...

  2. Django---进阶2

    目录 数据的查,改,删 django orm中如何创建表关系 django请求生命周期流程图(必会) 路由层 路由匹配 无名分组 有名分组 无名有名是否可以混合使用 反向解析 作业 数据的查,改,删 ...

  3. postman-5-授权

    授权 Inherit auth from parent 假设现在将一个文件夹添加到集合中.在授权选项卡下,默认授权类型就被设置为“从父继承授权”“从父继承授权”设置表示默认情况下此文件夹中的每个请求都 ...

  4. SQL注入原理及代码分析(二)

    前言 上一篇文章中,对union注入.报错注入.布尔盲注等进行了分析,接下来这篇文章,会对堆叠注入.宽字节注入.cookie注入等进行分析.第一篇文章地址:SQL注入原理及代码分析(一) 如果想要了解 ...

  5. SQL批量插入数据【万级】

    1.每4000条插入一次 for (int i = 0; i < dt.Rows.Count; i++) { IsTBProductForStockInfo model = new IsTBPr ...

  6. Python math 、cmath

    1.math dir(math) 2.cmath 复数运算

  7. 数据可视化之powerBI技巧(十)利用度量值,轻松进行动态指标分析

    在一个图表中,可以将多项指标数据放进去同时显示,如果不想同时显示在一起,可以根据需要动态显示数据吗?在 PowerBI 中当然是可以的. 下面就看看如何利用度量值进行动态分析. 假如要分析的指标有销售 ...

  8. [USACO3.1]形成的区域(扫描线+离散化)

    [USACO3.1]形成的区域(P6432) 日期:2020-05-31 目录 [USACO3.1]形成的区域(P6432) 一.题意分析 二.算法分析 1. 暴力 0). 初始状态(红点为原点) 1 ...

  9. nginx随机模块—random_index

    nginx 随机模板参数: 这个模块他的作用于只有在location中,具体写法如下 location / { root html/code; andom_index on; #index index ...

  10. 【Python学习笔记二】开始学习啦!如何在IDEA中新建python文件

    1.新建module   2.选择本地安装的python   3.右键新建的module,创建python file就可以开始编程了   4.有时候回出现无法识别python内建函数的问题,就是运行没 ...