首先先直接对图进行二染色,dfs染完色后,有的边为搜索树边,有的为非树边,当非树边连接的两头的点为异色的时候,那么很明显这条非树边和树边构成的环上的边必然不可能成为答案;如果非树边的两端的点同色,那么所有这种类型的非树边与树边构成的环的交集就是答案,对于一条这样的非树边,如果要使其变成二分图的合法边,那么必然会在其与树边构成的环中剔除掉一条边,这样树变成了两个部分,把其中一部分反色,在连上这条非树边,也是一个合法二分图,那么所有这种类型的边构成的环的交集,就是答案的可选集。

  代码

 #include<cstdio>
#include<algorithm>
#include<cstring>
#define N 500010
using namespace std;
int n,m,i,a[N],b[N],dp,p[N],pre[N],tt[N],id[N],vis[N],treeEdge[N];
int deep[N],color[N],fa[N],sum[N],cnt,value[N];
int s[N][];
void link(int x,int y,int z)
{
dp++;pre[dp]=p[x];p[x]=dp;tt[dp]=y;id[dp]=z;
}
void dfs(int x)
{
int i;
vis[x]=;
i=p[x];
while (i)
{
if (!vis[tt[i]])
{
deep[tt[i]]=deep[x]+;
treeEdge[id[i]]=;
color[tt[i]]=-color[x];
fa[tt[i]]=x;
dfs(tt[i]);
}
i=pre[i];
}
}
void gao(int x)
{
int i,tmp=;
vis[x]=;
i=p[x];
while (i)
{
if (!vis[tt[i]])
{
gao(tt[i]);
tmp+=sum[tt[i]];
value[id[i]]=sum[tt[i]];
}
i=pre[i];
}
sum[x]+=tmp;
}
int lca(int x,int y)
{
if(deep[x]>deep[y])x^=y^=x^=y;
int i;
for(i=;i>=;i--)
{
if(deep[y]-deep[x]>=(<<i))
{
y=s[y][i];
}
}
if(x==y)return x;
for(i=;i>=;i--)
{
if(s[x][i]!=s[y][i])
{
x=s[x][i];
y=s[y][i];
}
}
return fa[x];
} int main()
{
scanf("%d%d",&n,&m);
for (i=;i<=m;i++)
{
scanf("%d%d",&a[i],&b[i]);
link(a[i],b[i],i);
link(b[i],a[i],i);
}
for (i=;i<=n;i++) if (!vis[i]) dfs(i);
for(i=;i<=n;i++)s[i][]=fa[i];
for(int h=;h<;h++)
{
for(i=;i<=n;i++)
{
s[i][h]=s[s[i][h-]][h-];
}
}
for (i=;i<=m;i++)
if ((!treeEdge[i])&&(color[a[i]]!=color[b[i]]))
{
sum[a[i]]--;
sum[b[i]]--;
sum[lca(a[i],b[i])]+=;
}
for (i=;i<=m;i++)
if ((!treeEdge[i])&&(color[a[i]]==color[b[i]]))
{
cnt++;
sum[a[i]]++;
sum[b[i]]++;
sum[lca(a[i],b[i])]-=;
}
memset(vis,,sizeof(vis));
for (i=;i<=n;i++)
if (!vis[i]) gao(i);
int ans=;
for (i=;i<=m;i++)
if ((treeEdge[i])&&(value[i]==cnt)) ans++;
if (cnt==) ans++;
printf("%d\n",ans);
}

bzoj4238 电压的更多相关文章

  1. 【BZOJ4238】电压 DFS树

    [BZOJ4238]电压 Description 你知道Just Odd Inventions社吗?这个公司的业务是“只不过是奇妙的发明(Just Odd Inventions)”.这里简称为JOI社 ...

  2. bzoj4238 & loj2881 电压 二分图判定+dfs树

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4238 https://loj.ac/problem/2881 题解 如果想要让每一条边都有电流 ...

  3. [原创]DC-DC输出端加电压会烧毁

      在调试智能钥匙连续开锁出现故障的问题排查过程中,为了对比模拟开关TS5A3166对于开锁数据通信的影响,尝试短接模拟开关的输入输出脚,未曾想乌龙了一把,错把DC-DC芯片输入输出短接了(两者都是S ...

  4. STM32 ADC 测电压

    1. STM32F103 ADC 本例使用STM32F103芯片的PA1引脚测试模拟输入的电压值. 查看文档<STM32F103X.pdf>第31页,引脚定义图: 得知PA1使用ADC1的 ...

  5. CC2540中的电压检测

    /** * Battery level conversion from ADC to a percentage: * * The maximum ADC value for the battery v ...

  6. SAM4E单片机之旅——18、通过AFEC(ADC)获取输入的电压

    很多时候,一个电压不仅仅需要定性(高电平或者低电平),而且要定量(了解具体电压的数值).这个时候就可以用到模数转换器(ADC)了.这次的内容是测量开发板搭载的滑动变阻器(VR1)的电压,然后把ADC转 ...

  7. 迅为iTOP-4412核心板调整电压

    本文转自:http://www.topeetboard.com iTOP-4412核心板使用的电源管理芯片是三星专门针对4412研发的S5M8767,8767提供9路BUCK和28路LDO输出,每路电 ...

  8. STM32F0xx_ADC采集电压配置详细过程

    前言 关于ADC这一块的功能基本上也算是CortexM芯片的标配了.ST的每一块芯片都有这个功能,只是说因型号不同,通道数.位数等有所不同.STM8的芯片大多数都是10的,也就是说分辨率可达到:参考电 ...

  9. Arduino 模拟信号的读入并转化为0-5V电压

    int ledIn = A0; void setup(){ Serial.begin(9600); } void loop(){ int sensorValue = analogRead(ledIn) ...

随机推荐

  1. 更强大的trim功能,过滤汉字等

    第一种方法:通过php自带的函数 <?php /* trim 去除一个字符串两端空格, rtrim 是去除一个字符串右部空格, ltrim 是去除一个字符串左部空格. */ ?> < ...

  2. Windows 一键安装OpenSSL

    原理:OpenSSL在github上有开源项目,我们只需要把代码克隆到本地,在本地编译一下就好了 注意事项: 1->在github上获取源码,必须要安装git for windows,网址 ht ...

  3. php--yii框架表单验证

    在视图层利用表单小部件生成表单时,field只能是数据库中存在的, 例如: use yii\helpers\Html; use yii\widgets\ActiveForm; use yii\capt ...

  4. socketserve及其应用

    1.cmd命令 利用socket socket服务端 import socket import subprocess s = socket.socket() s.bind(("127.0.0 ...

  5. 20145211 《Java程序设计》实验报告一:Java开发环境的熟悉(Windows+IDEA)

    实验要求 使用JDK编译.运行简单的Java程序: 使用IDEA 编辑.编译.运行.调试Java程序. 实验内容 命令行下Java程序开发 IDEA下Java程序开发.调试 练习(通过命令行和IDEA ...

  6. EntityFramework更新数据

    1.TryUpdateModel 使用很方便,但实际更新数据的过程还是先select,再update.另外发现一个问题,对于input的type类型file的字段,无法使用TryUpdateModel ...

  7. [LeetCode]题解(python):088 Merge Sorted Array

    题目来源 https://leetcode.com/problems/merge-sorted-array/ Given two sorted integer arrays nums1 and num ...

  8. meta的学习记录

    meta的学习记录 最近再学响应式的布局,就先来总结一下我们的viewport. 什么是viewport呢? 手机浏览器是把页面放在一个虚拟的“窗口”(viewport)中,通常这个虚拟的“窗口”(v ...

  9. 打造安全的App!iOS安全系列之 HTTPS

    如何打造一个安全的App?这是每一个移动开发者必须面对的问题.在移动App开发领域,开发工程师对于安全方面的考虑普遍比较欠缺,而由于iOS平台的封闭性,遭遇到的安全问题相比于Android来说要少得多 ...

  10. 详解OpenGL中的各种变换(投影变换,模型变换,视图变换)(完)——法线变换

    前面两节内容已经说完了所有的三种变换.也就是说我们现在程序里面既不需要glLookAt(),也不需要gluPerspective(),这些矩阵我们都可以自己写.然后,再用glMultMatrix()来 ...