bzoj 4238 电压
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 电压的更多相关文章
- BZOJ 4238 电压 解题报告
BZOJ 4238 电压 考虑一条边成为答案以后,删去Ta后剩下的图是一个或很多个二分图,即没有奇环 则一条边可以成为答案,当且仅当自己在所有奇环的交上且不在偶环上. 考虑建出dfs树,那么返祖边一定 ...
- BZOJ 4238: 电压 DFS树
分类讨论一下奇环和偶环的情况. code: #include <bits/stdc++.h> #define N 200006 #define setIO(s) freopen(s&quo ...
- 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,记 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 树形dp专题总结
树形dp专题总结 大力dp的练习与晋升 原题均可以在网址上找到 技巧总结 1.换根大法 2.状态定义应只考虑考虑影响的关系 3.数据结构与dp的合理结合(T11) 4.抽直径解决求最长链的许多类问题( ...
- dfs树
dfs树是解决图中带环的利器. 前天CF的F题就是dfs树,但是当时我没有认真思考 觉着找到一个环过于困难 当时没有想到 也没理解dfs树的意义. 对于一张无向图求出一个dfs树 这个树有两种边 树边 ...
- BZOJ 2127: happiness [最小割]
2127: happiness Time Limit: 51 Sec Memory Limit: 259 MBSubmit: 1815 Solved: 878[Submit][Status][Di ...
- BZOJ 3275: Number
3275: Number Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 874 Solved: 371[Submit][Status][Discus ...
- BZOJ 2879: [Noi2012]美食节
2879: [Noi2012]美食节 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1834 Solved: 969[Submit][Status] ...
随机推荐
- plus.runtime.quit()是个好函数
对于H5+APP开发,应用的生命周期监听函数里是对应用行为的监控,但是并不对应用执行退出或重启操作.相关操作还是要使用mui
- GAN网络从入门教程(三)之DCGAN原理
目录 DCGAN简介 DCGAN的特点 几个重要概念 下采样(subsampled) 上采样(upsampling) 反卷积(Deconvolution) 批标准化(Batch Normalizati ...
- 华为交换机如何配置SSH远程登录,一分钟秒学会
从事网络运维工作的小伙伴们都知道,在交换机正式上线时,必须完成配置SSH远程登录,这样做目的是为了日后,维护方便,不需要每次登录设备都要跑到机房,这样既不现实,又费事. 远程登录方式 目前网络设备中主 ...
- JVM 专题十二:运行时数据区(七)对象的实例化内存布局与访问定位
1. 对象的实例化 1.1 创建对象的方式 new 最常见的方式 变形1 : Xxx的静态方法 变形2 : XxBuilder/XxoxFactory的静态方法 Class的newInstance() ...
- Flask 基础组件(六):Session
除请求对象之外,还有一个 session 对象.它允许你在不同请求间存储特定用户的信息.它是在 Cookies 的基础上实现的,并且对 Cookies 进行密钥签名要使用会话,你需要设置一个密钥. 设 ...
- 微信小程序接口封装、原生接口封装、request、promise封装
相信大家在做微信小程序的时候会有很多地方需要调用接口,就和pc以及手机端一样,多个页面多次调用会有很多状态,那为了节省大家的开发时间就会需要给请求的接口做一些简单封装,便于开发,在这里我用了两个js, ...
- 05-Python模块
一.简介 模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py.模块可以被其他程序导入来使用模块具有的功能.这也是使用python标准库的方式. import time start_time ...
- Azure Web App (三)切换你的Net Core Web 项目的数据库连接字符串
一,引言 上一篇文章讲到今天我们演示了一下,如何在Web App中创建 “Deployment Slot”进行快速无停机部署新功能代码,也使用VS进行发布到创建的Web App中创建的新的部署槽位中, ...
- CobaltStrike上线Linux主机(CrossC2)
一.简述 CrossC2插件是为企业和红团队人员提供的安全框架,支持 CobaltStrike 对其他平台的渗透测试(Linux / MacOS /...),支持自定义模块,并包括一些常用的渗透模块. ...
- 【运维--安全相关】cerbot证书自动化续期
前言 Certbot可以配置为在证书过期之前自动更新证书.由于Let’s Encrypt SSL证书有效期时间为90天,所以建议您利用此功能.您可以通过运行以下命令来测试证书的自动续订: 安装 yum ...