【BZOJ4238】电压 DFS树
【BZOJ4238】电压
Description
Input
Output
Sample Input
1 2
2 3
3 2
4 3
Sample Output
HINT

题解:题意差不多就是给你一个无向图,让你找出一条边,将它的两个顶点染成相同的颜色,使得剩下的图是一个二分图。
判断二分图就是找奇环,自然要用到DFS树,我们找出这条边后,一定要保证剩下的图中不含奇环。所以,如果一条边被所有奇环包含,我们可以选择它。
但是好像不对?如果一条边既被奇环包含又被偶环包含,那么去掉这条边后,奇半环和偶半环又组合成了一个奇环,所以我们选择的边在满足被所有奇环包含的同时,还要满足不能被偶环包含。
具体方法:用DFS树处理出每条边被多少个奇环和偶环包含就行了。
你可能会疑问:
1.假如原图中没有奇环怎么办?那么任意一条不被偶环覆盖的边都是可行的,你会发现这种情况上面已经处理过了。
2.如果有多个互不相交的奇环怎么办?答案显然是0啊。。。
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int maxn=100010;
int n,m,cnt,H1,H2,ans;
int to[maxn<<2],next[maxn<<2],vis[maxn<<2],val[maxn<<1],head[maxn],dep[maxn],h1[maxn],h2[maxn];
inline int z(int x){ return x>0?x:-x;}
int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
void add(int a,int b)
{
to[cnt]=b,next[cnt]=head[a],head[a]=cnt++;
}
void dfs(int x)
{
for(int i=head[x];i!=-1;i=next[i])
{
if(vis[i]) continue;
vis[i^1]=1;
if(!dep[to[i]]) dep[to[i]]=dep[x]+1,dfs(to[i]),h1[x]+=h1[to[i]],h2[x]+=h2[to[i]];
else if((dep[x]-dep[to[i]])&1) H2++,h2[x]++,h2[to[i]]--;
else H1++,h1[x]++,h1[to[i]]--;
}
}
int main()
{
n=rd(),m=rd();
int i,a,b;
memset(head,-1,sizeof(head));
for(i=1;i<=m;i++) a=rd(),b=rd(),add(a,b),add(b,a);
for(i=1;i<=n;i++) if(!dep[i]) dep[i]=1,dfs(i);
for(i=0;i<cnt;i+=2)
{
a=to[i],b=to[i^1];
if(dep[a]<dep[b]) swap(a,b);
if(dep[a]==dep[b]+1)
{
if(h1[a]==H1&&!h2[a]) ans++;
}
else if(!((dep[a]-dep[b])&1)&&H1==1) ans++;
}
printf("%d",ans);
return 0;
}
【BZOJ4238】电压 DFS树的更多相关文章
- BZOJ 4238: 电压 DFS树
分类讨论一下奇环和偶环的情况. code: #include <bits/stdc++.h> #define N 200006 #define setIO(s) freopen(s&quo ...
- bzoj4238 & loj2881 电压 二分图判定+dfs树
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4238 https://loj.ac/problem/2881 题解 如果想要让每一条边都有电流 ...
- BZOJ_4238_电压_树上差分+dfs树
BZOJ_4238_电压_树上差分+dfs树 Description 你知道Just Odd Inventions社吗?这个公司的业务是“只不过是奇妙的发明(Just Odd Inventions)” ...
- dfs树
dfs树是解决图中带环的利器. 前天CF的F题就是dfs树,但是当时我没有认真思考 觉着找到一个环过于困难 当时没有想到 也没理解dfs树的意义. 对于一张无向图求出一个dfs树 这个树有两种边 树边 ...
- zstu.4191: 无向图找环(dfs树 + 邻接表)
4191: 无向图找环 Time Limit: 5 Sec Memory Limit: 128 MB Submit: 117 Solved: 34 Description 给你一副无向图,每条边有 ...
- LOJ2250 [ZJOI2017] 仙人掌【树形DP】【DFS树】
题目分析: 不难注意到仙人掌边可以删掉.在森林中考虑树形DP. 题目中说边不能重复,但我们可以在结束后没覆盖的边覆盖一个重复边,不改变方案数. 接着将所有的边接到当前点,然后每两个方案可以任意拼接.然 ...
- Codeforces962F Simple Cycles Edges 【双连通分量】【dfs树】
题目大意: 给出一个无向图,问有哪些边只属于一个简单环. 题目分析: 如果这道题我们掌握了点双连通分量,那么结论会很显然,找到每个点双,如果一个n个点的点双正好由n条边构成,那么这些边都是可以的. 这 ...
- BZOJ5203 [NEERC2017 Northern] Grand Test 【dfs树】【构造】
题目分析: 首先观察可知这是一个无向图,那么我们构建出它的dfs树.由于无向图的性质我们可以知道它的dfs树只有返祖边.考虑下面这样一个结论. 结论:若一个点的子树中(包含自己)有两个点有到它祖先的返 ...
- 【BZOJ4424】Cf19E Fairy DFS树
[BZOJ4424]Cf19E Fairy Description 给定 n 个点,m 条边的无向图,可以从图中删除一条边,问删除哪些边可以使图变成一个二分图. Input 第 1 行包含两个整数 n ...
随机推荐
- jcraft--SFTP demo
import java.awt.Container; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import ...
- java程序容错
程序最怕出错的方式就是直接闪退 编程应该以这种方式进行,保证结构不出错,数据可容错的方式 比如 fungetsonmfrominternet(){变量 a a=从网络返回数据 return a } 在 ...
- web.xml文件的 xsd引用(或dtd引用)学习
1. 为什么web.xml会有不同版本的xsd引用: JDK依赖变化: 或 servlet(JAVA EE)自身API的改变: 2. 为什么会有dtd和xsd两个版本的区别 我是在这篇文章中看到的,作 ...
- Dedecms文章内容页和图片集内容页,调用缩略图的方法
文章内容页缩略图的调用,图片集内容页缩略图的调用,相信大家都想找这个,对于初学者来说,一大福音> 文章内容页和图片集内容页,缩略图的调用.适合内页中调用. 1 <img src=" ...
- django发送邮件配置
配置如下,settings中配置: EMAIL_HOST = 'smtp.163.com' EMAIL_PORT = '25' EMAIL_HOST_USER = 'contact108@163.co ...
- ubuntu 添加用户
sudo useradd 用户名 创建用户 sudo passwd 用户名 修改用户密码 添加sudo权限 sudo usermod -aG sudo(要添加的用户组,也可以是root) 用户名 su ...
- JAVA Eclipse开发Android程序如何自定义图标
直接用做好的png图片替换res的所有分辨率的lc_launcher.png图片 注意到不同文件夹有不同的分辨率,直接把png图片做成最大的替换掉即可,不管小的. drawable-xxhdpi ...
- hdu 4372 第一类斯特林数
#include <cstdio> #include <iostream> #include <algorithm> #include <queue> ...
- .NET C#生成随机颜色,可以控制亮度,生成暗色或者亮色 基于YUV模式判断颜色明亮度
.NET C#生成随机颜色,可以控制亮度,生成暗色或者亮色 基于YUV模式判断颜色明亮度 随机颜色在日常开发中很常用到,有时候要控制颜色明亮度,比如在白色背景网页上的随机颜色,一般要求颜色稍微暗一 ...
- 笔记本WIFI卡简介
1.Intel AC9560(CNVI) AC9260(pcie) 3165D2W(pcie) 2.Realtek瑞昱 RTL8822be(pcie) RTL8723BU(USB) 英特尔在300系主 ...