生成树

题目链接

显然,如果是一棵树的话,那么任意拿一条边都是没关系的。

因此,我们先在图上随便生成一棵树,由于这是无向图,因此非树边只有返祖边。

那么,我们考虑非树边形成的环的奇偶性(即环上点数量的奇偶性)。

1.对于奇环:

不难发现,奇环上我们必须选一条边。换言之,我们选的边必须在奇环上。

2.对于偶环:

也不难发现,偶环上是不能选边的。

那么,本题就有大致思路了:

1.先构建一棵树

2.判断非树边构成的环的奇偶性,如果是奇环,利用树上差分把非树边两端在树上的路径上的边都+1;否则都-1,同时统计奇环数量cnt

3.遍历整棵树,判断一条边被加过的次数是否为cnt,若符合,则将ans++

注意:如果只有一个奇环,那么那条形成奇环的非树边也是可以选的,因此要将ans++

代码:

#include<bits/stdc++.h>
#define MAXN 200010
using namespace std;
int n,m,tot,head[MAXN],ST[MAXN],ED[MAXN],deep[MAXN],pre[MAXN][20],lg[MAXN],cnt[MAXN],sum,ans;
bool vis[MAXN],edge[MAXN*2],mark[MAXN];
struct node {int ed,id,last;
} G[MAXN*4];
void Add(int st,int ed,int id) {tot++;G[tot]=node {ed,id,head[st]};head[st]=tot;
}
vector<int> Tr[MAXN];
void DFS(int x,int fa) {deep[x]=deep[fa]+1;pre[x][0]=fa;for(int i=1;(1<<i)<=deep[x];i++)pre[x][i]=pre[pre[x][i-1]][i-1];vis[x]=true;for(int i=head[x]; ~i; i=G[i].last) {int t=G[i].ed;if(t==fa)continue;if(vis[t])continue;Tr[x].push_back(t);Tr[t].push_back(x);edge[G[i].id]=true;DFS(t,x);}
}
int LCA(int x,int y){if(deep[x]<deep[y])swap(x,y);while(deep[x]>deep[y])x=pre[x][lg[deep[x]-deep[y]]-1];if(x==y)return x;for(int i=lg[deep[x]]-1;i>=0;i--){if(pre[x][i]==pre[y][i])continue;x=pre[x][i],y=pre[y][i];}return pre[x][0];
}
void solve(int x,int fa){vis[x]=true;for(int i=0;i<Tr[x].size();i++){int t=Tr[x][i];if(t==fa)continue;solve(t,x);cnt[x]+=cnt[t];}
}
int main() {for(int i=1;i<=MAXN-10;i++)lg[i]=lg[i-1]+((1<<lg[i-1])==i);memset(head,-1,sizeof(head));scanf("%d %d",&n,&m);for(int i=1; i<=m; i++) {int x,y;scanf("%d %d",&x,&y);Add(x,y,i);Add(y,x,i);}tot=0;for(int i=1;i<=n;i++){if(vis[i])continue;DFS(i,0);}for(int i=1;i<=n;i++){for(int j=head[i];~j;j=G[j].last){int t=G[j].ed,id=G[j].id;if(edge[id])continue;int st=i,ed=t;if(deep[st]<deep[ed])swap(st,ed);ST[++tot]=st,ED[tot]=ed,edge[id]=true;}}for(int i=1;i<=tot;i++){int st=ST[i],ed=ED[i],lca=LCA(st,ed);if((deep[st]+deep[ed]-2*deep[lca]+1)%2==0)cnt[st]--,cnt[ed]--,cnt[lca]+=2;else cnt[st]++,cnt[ed]++,cnt[lca]-=2,sum++;}memset(vis,false,sizeof(vis));for(int i=1;i<=n;i++){if(vis[i])continue;mark[i]=true;solve(i,0);}for(int i=1;i<=n;i++){if(mark[i])continue;if(cnt[i]==sum)ans++;}if(sum==1)ans++;printf("%d",ans);return 0;
}

转载于:https://www.cnblogs.com/SillyTieT/p/11476923.html

【BZOJ】P4238 电压相关推荐

  1. BZOJ 4238 电压 解题报告

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

  2. BZOJ.1558.[JSOI2009]等差数列(线段树 差分)

    BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...

  3. S-T平面图中利用最短路求最小割(BZOJ 1001)

    BZOJ 1001: [BeiJing2006]狼抓兔子 最小割 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢 ...

  4. 如何设计四象限电压转换电路?

    四象限电源是:可以吸收和提供正负电流和电压的电源. 虽然简单电压转换器可以从输入电压生成固定的输出电压,但在某些应用中,这种特性是不够的. 举个例子:控制与电容相连的电压节点,这些电容可以充电至任何电 ...

  5. BZOJ 1124: [POI2008]枪战Maf(构造 + 贪心)

    题意 有 \(n\) 个人,每个人手里有一把手枪.一开始所有人都选定一个人瞄准(有可能瞄准自己).然后他们按某个顺序开枪,且任意时刻只有一个人开枪. 因此,对于不同的开枪顺序,最后死的人也不同. 问最 ...

  6. BZOJ 2957楼房重建

    传送门 线段树 //Twenty #include<cstdio> #include<cstdlib> #include<iostream> #include< ...

  7. BZOJ.5249.[九省联考2018]iiidx(贪心 线段树)

    BZOJ LOJ 洛谷 \(d_i\)不同就不用说了,建出树来\(DFS\)一遍. 对于\(d_i\)不同的情况: Solution 1: xxy tql! 考虑如何把这些数依次填到树里. 首先对于已 ...

  8. bzoj 4871: [Shoi2017]摧毁“树状图”

    4871: [Shoi2017]摧毁"树状图" Time Limit: 25 Sec  Memory Limit: 512 MB Submit: 53  Solved: 9 [Su ...

  9. BZOJ 1592. Making the Grade(思维,数据结构优化DP,以及三个拓展问题)[Usaco2008 Feb]【BZOJ计划】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 BZOJ简单题合集x 目录 BZOJ 1592. Making the Grade 拓展问题一 拓展问 ...

  10. BZOJ 1590.Secret Message 秘密信息(Trie树) [Usaco2008 Dec]【BZOJ计划】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 BZOJ简单题合集x Weblink https://hydro.ac/d/bzoj/p/1590 P ...

最新文章

  1. 总结概括对于大数据、高并发的网站如何进行优化的问题
  2. html代码复制到asp中不一样了_迷你代码编程在线成语词典
  3. MySQL主从介绍、准备工作、配置主、配置从、测试主从同步、断电后恢复主从...
  4. 细节决定成败,做网站也是如此
  5. 重要更新,Office Add-in将全面支持Webview2
  6. 个人收集 - 1、自动消失的消息提示(Js+Div实现)
  7. 《计算机应用基础》试卷,《计算机应用基础》试卷(二)
  8. 使用第三方登录百度网盘时提示“由于网络原因无法载入页面 请点击刷新后重试”
  9. Jetty提交数据时报java.lang.IllegalStateException: Form too large270468>200000问题解决
  10. 数据库系统工程师输给了计算机等级考试二级
  11. 面试官:谈谈分布式一致性机制,我一脸懵逼。。
  12. java.io.IOException: Connection reset by peer
  13. 模糊c–均值聚类算法的原理解释及推导
  14. 题目234 吃土豆
  15. 我的RecyclerView布局ysk
  16. sencha touch 相机,相册调用
  17. 浅谈虚拟机的垃圾回收
  18. qs计算机专业排名2017,2017年最新世界大学专业排名权威发布!
  19. Ubuntu14.04下安装vim显示没有可用的软件包vim-gtk
  20. adc0809c语言编程,单片机C语言程序设计之ADC0809数模转换与显示

热门文章

  1. 2022年可能会继续的一些品牌设计趋势
  2. C/C++生成随机数
  3. 【cvpr2022】ReSTR: Convolution-free Referring Image Segmentation Using Transformers
  4. 真没想到,vmware进入 bios设置 的方法是这样的
  5. 5.验证面试高频问题整理(附答案)
  6. php如何计算天数,php计算日期相差天数二种方法
  7. 5大输入法突然下架!得知真相的网友懵了:我都用了10年了……
  8. 2021中国隧道与地下空间大会暨中国(城市)地下空间学会(筹)成立大会
  9. 闲鱼上卖什么东西一年赚了18万?
  10. 虚幻引擎4控制台变量和命令