题目描述

科学家在“无限神机”($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模拟测试]:电压机制(图论+树上差分)的更多相关文章

  1. [CSP-S模拟测试]:环(图论+期望)

    题目传送门(内部题79) 输入格式 第一行读入两个整数$n,e$表示节点数及$cwystc$已确定的有向边边数. 接下来$e$行,每行两个整数$x,y$描述$cwystc$确定的边. 输出格式 输出一 ...

  2. [CSP-S模拟测试]:连连看(图论+容斥)

    题目传送门(内部题74) 输入格式 输入文件$link.in$ 第一行三个整数$n,m,k$,之间用空格隔开,$n,m$表示地图行数和列数,$k$表示每个方块周围相邻的位置(至多有$4$个,至少有$2 ...

  3. [CSP-S模拟测试]:Graph(图论+贪心)

    题目描述 给定一张$n$个点$m$条边的无向图,每条边连接两个顶点,保证无重边自环,不保证连通你想在这张图上进行若干次旅游,每次旅游可以任选一个点$x$作为起点,再走到一个与 $x$直接有边相连的点$ ...

  4. csps模拟85表达式密码,电压机制,括号密码题解

    题面:https://www.cnblogs.com/Juve/articles/11733280.html 表达式密码: 是个水题... #include<iostream> #incl ...

  5. [CSP-S模拟测试]:e(树上主席树)

    题目传送门(内部题66) 输入格式 第一行,一个正整数$n$,一个自然数$q$,一个整数$type$.第二行,$n$个正整数,代表$a_i$.接下来$n-1$行,每行两个正整数$u$.$v$,代表树中 ...

  6. csp-s模拟测试85

    csp-s模拟测试85 $T1$全场秒切没有什么区分度,$T2$全场成功转化题意但是我并不会打,$T3$暴力都没打很遗憾. 100 00:21:49 02:56:35 02:56:49 135 02: ...

  7. 【例题收藏】◇例题·6◇ 电压机制(voltage)

    ◆例题·6◆ 电压机制 周六日常模拟赛……已经不知道该说什么了(感觉做不出来的都是好题) ▷ 题目 (终于不用自己翻译英文题了╮(╯-╰)╭) [问题描述] 科学家在“无限神机”(Infinity M ...

  8. 利用Python中的mock库对Python代码进行模拟测试

    这篇文章主要介绍了利用Python中的mock库对Python代码进行模拟测试,mock库自从Python3.3依赖成为了Python的内置库,本文也等于介绍了该库的用法,需要的朋友可以参考下     ...

  9. Python 的mock模拟测试介绍

    如何不靠耐心测试 可能我们正在写一个社交软件并且想测试一下"发布到Facebook的功能",但是我们不希望每次运行测试集的时候都发布到Facebook上. Python的unitt ...

随机推荐

  1. spring boot1.1 idea + springboot + mybatis(mybatis-generator) +mysql +html实现简单的登录注册

    前言 这两年springboot比较火,而我平时的工作中不怎么使用spring boot,所以工作之余就自己写写项目练练手,也跟大家一起学习. 打算从最开始的搭架子,登录注册,到后台管理的增删改查,业 ...

  2. [Codeforces 1245D] Shichikuji and Power Grid (最小生成树)

    [Codeforces 1245D] Shichikuji and Power Grid (最小生成树) 题面 有n个城市,坐标为\((x_i,y_i)\),还有两个系数\(c_i,k_i\).在每个 ...

  3. DataFrame.to_dict(orient='dict')

    DataFrame.to_dict(orient=’dict’) >>> df = pd.DataFrame({'name':[1,2,3],"class":[1 ...

  4. The Preliminary Contest for ICPC Asia Shanghai 2019 A. Lightning Routing I

    传送门 因为某些原因,所以我就去学了 $LCT$ 维护直径, $LCT$ 维护直径我上一个博客讲得很详细了:传送门 这里维护虚儿子用的是 $multiset$ ,没写可删堆 #include<i ...

  5. form表单添加富文本编辑器

    <div class="control-group"> <label class="control-label">内容:</lab ...

  6. Linux中如何添加/删除FTP用户并设置权限

    在linux中添加ftp用户,并设置相应的权限,操作步骤如下: 1.环境:ftp为vsftp.被设置用户名为test.被限制路径为/home/test 2.创建建用户:在root用户下:   user ...

  7. vue.js(1)--创建vue实例的基本结构

    vue实例基本结构与MVVM框架 (1)vue实例基本结构 <!DOCTYPE html> <html lang="en"> <head> &l ...

  8. JVM内存分配和垃圾回收以及性能调优

    JVM内存分配策略 一:堆中优先分配Eden 大多数情况下,对象都在新生代的Eden区中分配内存.而新生代会频繁进行垃圾回收. 二:大对象直接进入老年代 需要大量连续空间的对象,如:长字符串.数组等, ...

  9. wpf Textbox 回车就换行

    将 TextWrapping 属性设置为 Wrap 会导致输入的文本在到达 TextBox 控件的边缘时换至新行,必要时会自动扩展 TextBox 控件以便为新行留出空间. 将 AcceptsRetu ...

  10. inetd - 因特网“超级服务”

    总览 inetd - [ -d ] [ -q 队列长度 ] [ 配置文件名 ] 描述 inetd通常在系统启动时由/etc/rc.local引导.inetd会监听指定internet端口是否有连接要求 ...