LOJ10131暗的连锁
题目描述
原题来自:POJ 3417
Dark 是一张无向图,图中有 N 个节点和两类边,一类边被称为主要边,而另一类被称为附加边。Dark 有 N–1 条主要边,并且 Dark 的任意两个节点之间都存在一条只由主要边构成的路径。另外,Dark 还有 M 条附加边。
你的任务是把 Dark 斩为不连通的两部分。一开始 Dark 的附加边都处于无敌状态,你只能选择一条主要边切断。一旦你切断了一条主要边,Dark 就会进入防御模式,主要边会变为无敌的而附加边可以被切断。但是你的能力只能再切断 Dark 的一条附加边。
现在你想要知道,一共有多少种方案可以击败 Dark。注意,就算你第一步切断主要边之后就已经把 Dark 斩为两截,你也需要切断一条附加边才算击败了 Dark。
输入格式
第一行包含两个整数 N 和 M;
之后 N – 1 行,每行包括两个整数 A 和 B,表示 A 和 B 之间有一条主要边;
之后 M 行以同样的格式给出附加边。
输出格式
输出一个整数表示答案。
样例
样例输入
4 1
1 2
2 3
1 4
3 4
样例输出
3
数据范围与提示
对于 20% 的数据,1≤N,M≤100;
对于 100% 的数据,1≤N≤10^5,1≤M≤2×10^5。数据保证答案不超过 2^31−1。
_______________________________________________________________________________________
每一条非树边,都对应这一条树上的链,那么砍断这条非数遍后对应链上的数遍砍断就可以把图分成两半。
但是两条非树边对应的链可能有重合,这样砍断重合的边,图就不能分成两半。
所以对于每条非树边,要统计对应的树链上的各个边的重叠次数。这就用到了树上查分。
所以,树边的重叠次数为1是,答案加一,表示砍断树边后有一条非树边与之对应,可以破开环,使图成为两半。
如果重叠次数为2及以上,说明砍断该树边,还有两条及以上的非树边相连,不能把图分成两半,答案不变。
如果重叠次数为0,说明该树边不在环上,切断它直接可以把图分成两半,所以非树边可以任意选,答案加M.
_______________________________________________________________________________________
1 #include<bits/stdc++.h>
2 using namespace std;
3 const int maxn=1e5+10;
4 int n,m;
5 struct edge
6 {
7 int u,v,nxt;
8 }e[maxn<<1];
9 int head[maxn],js;
10 int dep[maxn],val[maxn];
11 int f[maxn][20];
12 long long ans;
13 void addage(int u,int v)
14 {
15 e[++js].u=u;e[js].v=v;
16 e[js].nxt=head[u];head[u]=js;
17 }
18 void dfs(int u,int fa)
19 {
20 dep[u]=dep[fa]+1;
21 f[u][0]=fa;
22 for(int i=1;i<20;++i)f[u][i]=f[f[u][i-1]][i-1];
23 for(int i=head[u];i;i=e[i].nxt)
24 {
25 int v=e[i].v;
26 if(fa!=v)dfs(v,u);
27 }
28 }
29 int lca(int u,int v)
30 {
31 if(dep[u]<dep[v])swap(u,v);
32 for(int i=19;i>=0;--i)if(dep[f[u][i]]>=dep[v])u=f[u][i];
33 if(u==v)return u;
34 for(int i=19;i>=0;--i)if(f[u][i]!=f[v][i])u=f[u][i],v=f[v][i];
35 return f[u][0];
36 }
37 void dfsf(int u,int fa)
38 {
39 for(int i=head[u];i;i=e[i].nxt)
40 {
41 int v=e[i].v;
42 if(v!=fa)
43 {
44 dfsf(v,u);
45 val[u]+=val[v];
46 }
47 }
48 if(val[u]==0 && u!=1)ans+=m;
49 else if(val[u]==1)ans++;
50 }
51 int main()
52 {
53 scanf("%d%d",&n,&m);
54 for(int u,v,i=1;i<n;++i)
55 {
56 scanf("%d%d",&u,&v);
57 addage(u,v);addage(v,u);
58 }
59 dfs(1,0);
60 for(int u,v,i=0;i<m;++i)
61 {
62 scanf("%d%d",&u,&v);
63 int l=lca(u,v);
64 ++val[u];++val[v];
65 val[l]-=2;
66 }
67 dfsf(1,0);
68 cout<<ans;
69 return 0;
70 }
LOJ10131暗的连锁的更多相关文章
- loj10131 暗的连锁
传送门 分析 首先我们知道如果在一棵树上加一条边一定会构成一个环,而删掉环上任意一条边都不改变连通性.我们把这一性质扩展到这个题上不难发现如果一条树边不在任意一个新边构成的环里则删掉这条边之后可以删掉 ...
- LOJ #10131 「一本通 4.4 例 2」暗的连锁
LOJ #10131 「一本通 4.4 例 2」暗的连锁 给一棵 \(n\) 个点的树加上 \(m\) 条非树边 , 现在需要断开一条树边和一条非树边使得图不连通 , 求方案数 . $n \le 10 ...
- LOJ10131. 「一本通 4.4 例 2」暗的连锁【树上差分】
LINK solution 很简单的题 你就考虑实际上是对每一个边求出两端节点分别在两个子树里面的附加边的数量 然后这个值是0第二次随便切有m种方案,如果这个值是1第二次只有一种方案 如果这个值是2或 ...
- 倍增法求lca:暗的连锁
https://loj.ac/problem/10131 #include<bits/stdc++.h> using namespace std; struct node{ int to, ...
- LOJ P10131 暗的连锁 题解
每日一题 day27 打卡 Analysis 对于每条非树边 , 覆盖 x 到 LCA 和 y到 LCA 的边 , 即差分算出每个点和父亲的连边被覆盖了多少次 .被覆盖 0 次的边可以和 m 条非树边 ...
- POJ3417 Network暗的连锁 (树上差分)
树上的边差分,x++,y++,lca(x,y)-=2. m条边可以看做将树上的一部分边覆盖,就用差分,x=1,表示x与fa(x)之间的边被覆盖一次,m次处理后跑一遍dfs统计子树和,每个节点子树和va ...
- LuoguP3128 [USACO15DEC]最大流Max Flow (树上差分)
跟LOJ10131暗的连锁 相似,只是对于\(lca\)节点把它和父亲减一 #include <cstdio> #include <iostream> #include < ...
- loj题目总览
--DavidJing提供技术支持 现将今年7月份之前必须刷完的题目列举 完成度[23/34] [178/250] 第 1 章 贪心算法 √ [11/11] #10000 「一本通 1.1 例 1」活 ...
- CSU训练分类
√√第一部分 基础算法(#10023 除外) 第 1 章 贪心算法 √√#10000 「一本通 1.1 例 1」活动安排 √√#10001 「一本通 1.1 例 2」种树 √√#10002 「一本通 ...
随机推荐
- [LeetCode]319. Bulb Switcher灯泡开关
智商压制的一道题 这个题有个数学定理: 一般数(非完全平方数)的因子有偶数个 完全平凡数的因子有奇数个 开开关的时候,第i个灯每到它的因子一轮的时候就会拨动一下,也就是每个灯拨动的次数是它的因子数 而 ...
- C# 使用 log4net 日志组件
一. 什么是 log4net Apache log4net 库是帮助程序员将日志语句输出到各种输出目标的工具,它是从Java中的Log4j迁移过来的一个.Net版的开源日志框架.log4net 的一 ...
- ip,子网掩码,网关以及dns简述
ip 描述 ip地址用于标识不同的计算机身份,ip地址=网络地址+主机地址 例子 192.168.1.168(ip地址)=192.168.1.0(网络地址)+0.0.0.168(主机地址) 寻址过程 ...
- JAVE JDK安装步骤
1.安装JDK 选择安装目录 安装过程中会出现两次 安装提示 .第一次是安装 jdk ,第二次是安装 jre .建议两个都安装在同一个java文件夹中的不同文件夹中.(不能都安装在java文件夹的根目 ...
- 【机制】JavaScript的原型、原型链、继承
1.原型和原型链的概念 js在创建一个对象时,比如叫 obj,都会给他偷偷的加上一个引用,这个引用指向的是一个对象,比如叫 yuanxing, 这个对象可以给引用它的对象提供属性共享,比如:yuanx ...
- Head First 设计模式 —— 04. 工厂 (Factory) 模式
思考题 如何将实例化具体类的代码从应用中抽离,或者封装起来,使它们不会干扰应用的其他部分? P111 将实例化具体类的代码放入一个对象中管理,通过不同入参决定实例化具体的类 简单工厂 不是23种GOF ...
- 总结(2019CSP之后),含题解
从\(\mathcal{CSP}\) 爆炸 到现在,已经有\(3\)个月了.这三个月间,我--这个小蒟蒻又接触了许多听不懂的东西 \(\mathcal{No.}1\) 字符串\(\mathcal{ha ...
- 辅助调用函数【call,apply,bind】
函数也是对象,每个函数都有自己的方法. e.g. var jane = { name:'Jane', sayHelloTo:function(name) { 'use strict'; console ...
- Java并发包源码学习系列:ReentrantLock可重入独占锁详解
目录 基本用法介绍 继承体系 构造方法 state状态表示 获取锁 void lock()方法 NonfairSync FairSync 公平与非公平策略的差异 void lockInterrupti ...
- 性能超四倍的高性能.NET二进制序列化库
二进制序列化在.NET中有很多使用场景,如我们使用分布式缓存时,通常将缓存对象序列化为二进制数据进行缓存,在ASP.NET中,很多中间件(如认证等)也都是用了二进制序列化. 在.NET中我们通常使用S ...