【LOJ#10131】暗的锁链
题目大意:给定一个 N 个点无向图的一棵生成树和另外 M 条边,第一次去掉生成树中的一条边,第二次去掉另外 M 条边中的一条边,求有多少种情况可以使得给定的无向图不连通。
题解:首先考虑该生成树,若新增加一条边,则会在树上形成一个环,这时若删除的树边在环上,则只有将环切断才能使得图不连通;若删除的树边不在环上,则切断任意一个其他边均可。因此,只需要计算出树上每条边是否在环中即可。再次分析加边过程,若在 x,y 两点加了一条边,则由 x,y,lca(x,y) 之间的所有边形成了一个环,将这条树链上的边权加一即可,由此引出树上差分做法,即:每个点记录下该点到父节点之间的边的环数,只需将 val[x],val[y] 加一,val[lca(x,y)] 减 2 即可,最后 dfs 求出子树和即可。注:根节点不参与答案贡献。
代码如下
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
inline int read(){
int x=0,f=1;char ch;
do{ch=getchar();if(ch=='-')f=-1;}while(!isdigit(ch));
do{x=x*10+ch-'0';ch=getchar();}while(isdigit(ch));
return f*x;
}
struct node{
int nxt,to;
}e[maxn<<2];
int tot=1,head[maxn],val[maxn];
inline void add_edge(int from,int to){
e[++tot]=node{head[from],to},head[from]=tot;
}
int n,m,f[maxn][30],dep[maxn];
long long ans;
void dfs(int u,int fa){
dep[u]=dep[fa]+1,f[u][0]=fa;
for(int i=1;i<=20;i++)f[u][i]=f[f[u][i-1]][i-1];
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;if(v==fa)continue;
dfs(v,u);
}
}
int lca(int x,int y){
if(dep[x]<dep[y])swap(x,y);
for(int i=20;i>=0;i--)if(dep[f[x][i]]>=dep[y])x=f[x][i];
if(x==y)return x;
for(int i=20;i>=0;i--)if(f[x][i]^f[y][i])x=f[x][i],y=f[y][i];
return f[x][0];
}
void read_and_parse(){
n=read(),m=read();
for(int i=1,x,y;i<n;i++){
x=read(),y=read();
add_edge(x,y),add_edge(y,x);
}
dfs(1,0);
}
void calc(int u,int fa){
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;if(v==fa)continue;
calc(v,u);
val[u]+=val[v];
}
if(u==1)return;
else if(!val[u])ans+=m;
else if(val[u]==1)++ans;
}
void solve(){
int x,y;
for(int i=1;i<=m;i++){
x=read(),y=read();
++val[x],++val[y],val[lca(x,y)]-=2;
}
calc(1,0);
printf("%lld\n",ans);
}
int main(){
read_and_parse();
solve();
return 0;
}
【LOJ#10131】暗的锁链的更多相关文章
- LOJ #10131 「一本通 4.4 例 2」暗的连锁
LOJ #10131 「一本通 4.4 例 2」暗的连锁 给一棵 \(n\) 个点的树加上 \(m\) 条非树边 , 现在需要断开一条树边和一条非树边使得图不连通 , 求方案数 . $n \le 10 ...
- LOJ P10131 暗的连锁 题解
每日一题 day27 打卡 Analysis 对于每条非树边 , 覆盖 x 到 LCA 和 y到 LCA 的边 , 即差分算出每个点和父亲的连边被覆盖了多少次 .被覆盖 0 次的边可以和 m 条非树边 ...
- loj #10131
抽离题意 求删除一条树边和一条非树边后将图分成不连通的两部分的方案数 对于一棵树,再加入一条边就会产生环.若只有一个环,说明只加入了一条非树边 (x, y),记 lca 为 l, 那么 对于任意一条 ...
- csp-s 考前刷题记录
洛谷 P2615 神奇的幻方 洛谷 P2678 跳石头 洛谷 P1226 [模板]快速幂||取余运算 洛谷 P2661 信息传递 LOJ P10147 石子合并 LOJ P10148 能量项链 LOJ ...
- loj题目总览
--DavidJing提供技术支持 现将今年7月份之前必须刷完的题目列举 完成度[23/34] [178/250] 第 1 章 贪心算法 √ [11/11] #10000 「一本通 1.1 例 1」活 ...
- LOJ 一本通一句话题解系列:
第一部分 基础算法 第 1 章 贪心算法 1):「一本通 1.1 例 1」活动安排:按照结束时间排序,然后扫一遍就可以了. 2):「一本通 1.1 例 2」种树:首先要尽量的往区间重叠的部分种树,先按 ...
- 倍增法求lca:暗的连锁
https://loj.ac/problem/10131 #include<bits/stdc++.h> using namespace std; struct node{ int to, ...
- 基于暗通道优先算法的去雾应用(Matlab/C++)
基于暗通道优先的单幅图像去雾算法(Matlab/C++) 算法原理: 参见论文:Single Image Haze Removal Using Dark Channel Pri ...
- 【基本技能篇】>>第3篇《暗时间_指导学习的方法论——心得》
暗时间——指导学习的方法论 ——2016年2月11日 打造自己的核心竞争力:①专业领域技能:②跨领域的技能(解决问题的能力,创新思维,判断与决策能力,表达沟通能力等等):③学习能力,持续学习和思考新知 ...
随机推荐
- 20155238 《JAVA程序设计》实验二(Java面向对象程序设计)实验报告
实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验要求 1.没有Linux基础的同学建议先学习<L ...
- 分布式Redis缓存串讲(一)
互联网应用的基石 现在流量稍微大些的网站,都会采取Redis.基于Redis的内存缓存特性,可以大幅度降低数据库的访问量,大大提升了网站的并发能力,充当数据库的削量先锋.既然Redis这么重要,我们从 ...
- java监听器(Listener)学习笔记
现在来说说Servlet的监听器Listener,它是实现了javax.servlet.ServletContextListener 接口的服务器端程序,它也是随web应用的启动而启动,只初始化一次, ...
- AndroidPN环境建立
AndroidPN环境 AndroidPN实现了从服务器到android移动平台的文本消息推送.这里先简单说一下androidPN的安装过程. 下载androidpn-client-0.5.0.zip ...
- Js_checkbox的互斥
function ck_click(obj) { var ck_20 = document.getElementById("ck_20"); var ck_25 = documen ...
- 借助第八代智能英特尔® 酷睿™ i7 处理器和 Unreal Swarm* 的强大性能快速构建光照
<虚幻竞技场>.<Robo Recall>等游戏的成功与 Unreal Engine 如何处理照明密切相关.原因之一就是静态光映射,但是这需要付出一定的代价:构建照明需要时间, ...
- 腾讯/阿里/百度 BAT人才体系的职位层级、薪酬、晋升标准
互联网圈有这么一句话:百度的技术,阿里的运营,腾讯的产品.那么代表互联网三座大山的BAT,内部人才体系有什么区别呢?今天老李就带领大家看一看~ ★ 腾讯 ★ 1. 职级 腾讯职级体系分6级,最低1 ...
- java后台面试知识点总结
本文主要记录在准备面试过程中遇到的一些基本知识点(持续更新) 一.Java基础知识 1.抽象类和接口的区别 接口和抽象类中都可以定义变量,但是接口中定义的必须是公共的.静态的.Final的,抽象类中的 ...
- io整理
http://www.cnblogs.com/rollenholt/archive/2011/09/11/2173787.html
- A02-java学习-classpath配置-标识符-java变量类型
学习 1, classpath的配置和使用 2, java的标识符命名规则和命名规范 3, 字符编码 4, java的变量类型 5, 程序的入口main方法解释