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 「一本通 ...
随机推荐
- java中给某个字段加锁
private String buildLock(String str) { StringBuilder sb = new StringBuilder(str); String lock = sb.t ...
- Java基础集合简单总结
集合 Collection单列集合有List 和 Set List集合有: ArrayList集合 特点: 1.存取有序 可以重复 有索引 2.底层是数组实现,查询快,增删慢 ArrayList底层: ...
- 本地显示Linux服务器的GUI程序
如果我们UI自动化脚本跑在 Linux 服务器环境上,这个时候我们是看不到界面的,如果不使用浏览器的无头模式,这个时候我们的程序就跑不起来了,如何在服务器环境不使用浏览器的无头模式下进行UI测试呢,我 ...
- 01 . Go之从零实现Web框架(框架雏形, 上下文Context,路由)
设计一个框架 大部分时候,我们需要实现一个 Web 应用,第一反应是应该使用哪个框架.不同的框架设计理念和提供的功能有很大的差别.比如 Python 语言的 django和flask,前者大而全,后者 ...
- 【转载】VUE的背景图引入
我现在的项目要将登录页面的背景引一图片做为背景图片,按原jsp中的写法,发现无法找到背景图片,最后从网上查资料,采用上面的写法,成功显示出背景图片,参考网址 https://blog.csdn.net ...
- 基于Python的接口自动化实战-基础篇之pymysql模块操作数据库
引言 在进行功能或者接口测试时常常需要通过连接数据库,操作和查看相关的数据表数据,用于构建测试数据.核对功能.验证数据一致性,接口的数据库操作是否正确等.因此,在进行接口自动化测试时,我们一样绕不开接 ...
- C# 9 新特性 —— 补充篇
C# 9 新特性 -- 补充篇 Intro 前面我们分别介绍了一些 C# 9 中的新特性,还有一些我觉得需要了解一下的新特性,写一篇作为补充. Top-Level Statements 在以往的代码里 ...
- Game of Sum
可以知道整体石子的总和一定的,所以一个人的得分越高,另一个人的得分就越低.不管怎么取任意时刻游戏的状态都是原始序列的一段连续子序列(即被玩家取剩下的序列). 因此,用d(i,j)表示玩家A在i到j部分 ...
- 18.java设计模式之中介者模式
基本需求 智能家庭包括各种设备,闹钟.咖啡机.电视机.窗帘等 要看电视时,各个设备可以协同工作,自动完成看电视的准备工作,比如流程为:闹铃响起->咖啡机开始做咖啡->窗帘自动落下-> ...
- 【Mysql】[Err] 1153 - Got a packet bigger than 'max_allowed_packet' bytes
今天用Navicat导入的时候报错 [Err] 1153 - Got a packet bigger than 'max_allowed_packet' bytes 原因是数据库默认是16M的数据,这 ...