[CSP-S模拟测试]:电压机制(图论+树上差分)
题目描述
科学家在“无限神机”($Infinity\ Machine$)找到一个奇怪的机制,这个机制有$N$个元件,有$M$条电线连接这些元件,所有元件都是连通的。两个元件之间可能有多条电线连接。
科学家对这些元件可以任意地设置为“高电压”和“低电压”两种模式,如果一条电线的一端为高电压,另一端为低电压,这条电线就会产生电流。
为了安全的研究“无限神机”,科学家需要找到一条电线,将它的两端设为相同的电压,并且除选择的这条电线外,其它所有电线都有电流(否则就没有研究的价值了)。
有多少条电线满足这样的条件?
输入格式
输入的第一行包含两个正整数$n,m$,表示元件数和电线数。
接下来$m$行,每行两个整数$u,v$,表示元件$u$和元件$v$有一条电线连接
输出格式
输出一个整数,表示有多少条电线满足条件
样例
样例输入1:
4 5
1 2
1 3
1 4
2 4
3 4
样例输出1:
1
样例输入2:
4 4
1 2
2 3
3 2
4 3
样例输出2:
2
数据范围与提示
样例$1$解释:
如图,只有电线$(1,4)$满足

样例$2$解释:
电线$(1,2)$和$(3,4)$满足要求

数据范围:
对于$10/%$的数据,满足$n\leqslant 1,000,m\leqslant 2,000$
对于另外$10/%$的数据,满足$m=n$
对于另外$35/%$的数据,满足$m\leqslant n+100$
对于$100/%$的数据,满足$2\leqslant n\leqslant 100,000,1\leqslant m\leqslant 200,000$
题解
再一次被语文打倒(可能是我语文太菜了叭~)……
先来解释一下题意,在样例$2$中$2$和$3$之间的边之所以不能设成相同的电压,是因为之后剩下那条边两端的电压就相同了,也就没有电流了。
为方便,不妨将一条电线两端电压设成相同成为“删”掉这条边。
话个图我们便会发现,偶环中的都不能删,如下图中无论删掉哪条边,对面的边两端电压都会相同。

但是,不在偶环里的就一定能删吗?
看下面这一张图$\downarrow$

可以发现,$(2,3)$和$(5,6)$互相牵制,都不能删。
于是我们还可以推得,一条边必须能被所有奇环包含并且不被任何偶环包含才能被删。
那么怎么求呢?
其实如果我说利用树上差分思想就不那么难了,先建一棵$DFS$树,剩下的边全部为反祖边,判断环是奇是偶然后分别用两个数组记录即可(设这条边从$u$到$v$,$v$是祖先,在$u$处$--$并在$v$处$++$即可)。
注意数据并没有保证联通!!!
时间复杂度:$\Theta(n+m)$。
期望得分:$100$分。
实际得分:$100$分。
代码时刻
#include<bits/stdc++.h>
using namespace std;
struct rec{int nxt,to;bool dead;}e[400002];
int head[100001],cnt=1;
int n,m;
int odd[100001],eve[100001],cut[400002],depth[100001],in[100001];
bool vis[100001];
int ans;
void add(int x,int y)
{
e[++cnt].nxt=head[x];
e[cnt].to=y;
head[x]=cnt;
}
void dfs(int x)
{
vis[x]=1;
for(int i=head[x];i;i=e[i].nxt)
{
if(cut[i])continue;
cut[i]=cut[i^1]=1;
if(vis[e[i].to])
{
if((depth[x]-depth[e[i].to])&1){eve[e[i].to]--;eve[x]++;}
else{odd[e[i].to]--;odd[x]++;odd[0]++;}
}
else
{
depth[e[i].to]=depth[x]+1;
in[e[i].to]=i;
dfs(e[i].to);
}
}
}
void dfs(int x,int f)
{
for(int i=head[x];i;i=e[i].nxt)
if(in[e[i].to]==i)
{
dfs(e[i].to,x);
odd[x]+=odd[e[i].to];
eve[x]+=eve[e[i].to];
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
add(u,v);add(v,u);
}
for(int i=1;i<=n;i++)if(!vis[i])dfs(i);
if(odd[0]==1)ans=1;
for(int i=1;i<=n;i++)if(!in[i])dfs(i,0);
for(int i=1;i<=n;i++)
if(in[i]&&odd[i]==odd[0]&&!eve[i])ans++;
printf("%d",ans);
return 0;
}
rp++
[CSP-S模拟测试]:电压机制(图论+树上差分)的更多相关文章
- [CSP-S模拟测试]:环(图论+期望)
题目传送门(内部题79) 输入格式 第一行读入两个整数$n,e$表示节点数及$cwystc$已确定的有向边边数. 接下来$e$行,每行两个整数$x,y$描述$cwystc$确定的边. 输出格式 输出一 ...
- [CSP-S模拟测试]:连连看(图论+容斥)
题目传送门(内部题74) 输入格式 输入文件$link.in$ 第一行三个整数$n,m,k$,之间用空格隔开,$n,m$表示地图行数和列数,$k$表示每个方块周围相邻的位置(至多有$4$个,至少有$2 ...
- [CSP-S模拟测试]:Graph(图论+贪心)
题目描述 给定一张$n$个点$m$条边的无向图,每条边连接两个顶点,保证无重边自环,不保证连通你想在这张图上进行若干次旅游,每次旅游可以任选一个点$x$作为起点,再走到一个与 $x$直接有边相连的点$ ...
- csps模拟85表达式密码,电压机制,括号密码题解
题面:https://www.cnblogs.com/Juve/articles/11733280.html 表达式密码: 是个水题... #include<iostream> #incl ...
- [CSP-S模拟测试]:e(树上主席树)
题目传送门(内部题66) 输入格式 第一行,一个正整数$n$,一个自然数$q$,一个整数$type$.第二行,$n$个正整数,代表$a_i$.接下来$n-1$行,每行两个正整数$u$.$v$,代表树中 ...
- csp-s模拟测试85
csp-s模拟测试85 $T1$全场秒切没有什么区分度,$T2$全场成功转化题意但是我并不会打,$T3$暴力都没打很遗憾. 100 00:21:49 02:56:35 02:56:49 135 02: ...
- 【例题收藏】◇例题·6◇ 电压机制(voltage)
◆例题·6◆ 电压机制 周六日常模拟赛……已经不知道该说什么了(感觉做不出来的都是好题) ▷ 题目 (终于不用自己翻译英文题了╮(╯-╰)╭) [问题描述] 科学家在“无限神机”(Infinity M ...
- 利用Python中的mock库对Python代码进行模拟测试
这篇文章主要介绍了利用Python中的mock库对Python代码进行模拟测试,mock库自从Python3.3依赖成为了Python的内置库,本文也等于介绍了该库的用法,需要的朋友可以参考下 ...
- Python 的mock模拟测试介绍
如何不靠耐心测试 可能我们正在写一个社交软件并且想测试一下"发布到Facebook的功能",但是我们不希望每次运行测试集的时候都发布到Facebook上. Python的unitt ...
随机推荐
- C++ day01 预备知识、C++综述、教材、推荐阅读。
C++ day01: 1.预备知识? 1)什么是编程 编程,即编订程序. 程序 = 数据 + 算法(蛋糕 = 糖.鸡蛋.奶油 + 打鸡蛋.加糖.烤) 2)编程语言 最初的编程是用二进制代码(即“机器码 ...
- isinstance与issubclass,反射
目录 isinstance与issubclass isinstance issubclass 反射 定义 反射在模块中的应用 内置方法 isinstance与issubclass isinstance ...
- ftp安装和虚拟用户创建(终于搞清楚了)
安装 一.安装 sudo apt-get install vsftpd 二.查看安装结果 安装完毕,检查vsftpd进程是否已启动,可以查看进程或者查看监听端口 ps -eaf|grep vsftpd ...
- HBASE学习笔记(四)
这两天把要前几天的知识点回顾一下,接下来我会用自己对知识点的理解来写一些东西 一.知识点回顾 1.hbase集群启动:$>start-hbase.sh ===>hbase-daemon.s ...
- java复习(3)继承
一.继承为题的提出 ---------------------------------------------------- 我们知道面向对象的三大特性是:封装.继承和多态,可以知道继承在java应用 ...
- 修改MIGO或者ML81N产生的会计凭证项目文本增强
在程序:MM07MFF9_F_BELEG_ERGAENZEN下做隐式增强
- hadoop最简伪分布式安装
本次安装运行过程使用的是Ubuntu16.04 64位+Hadoop2.5.2+jdk1.7.0_75 Notice: Hadoop2.5.2版本默认只支持64位系统 使用的jdk可以为1.7和1.8 ...
- 在树莓派Zero上使用C#+Mono驱动TM1637四位数码管
最近闲着无聊,买了个树莓派Zero,准备在上面跑.Net Core,来驱动各种传感器 就是上面这货.之前手上已经有一个树莓派3B+,但是介于3B+已经被我挂在路由器旁边当做服务器用,不是很方便拿来研究 ...
- Linux操作系统笔记
#include <stdio.h> #include <stdlib.h> #include <unistd.h> //linux下面的头文件 #include ...
- qtwebkit 启动时间慢
qtwebkit 启动时间慢 qtwebkit 启动时间慢 qtwebkit 启动时间慢