poj 3417 Network(tarjan lca)
poj 3417 Network(tarjan lca)
先给出一棵无根树,然后下面再给出m条边,把这m条边连上,然后每次你能毁掉两条边,规定一条是树边,一条是新边,问有多少种方案能使树断裂。
我们设添加了一条新边后,树形成了一个环,表示为x->y->lca(x,y),我们将其中的边都覆盖一次。添加了多条新边后,可知树上有些边是会被多次覆盖的,画图很容易发现,但一个树边被覆盖了2次或以上,它就是一条牢固的边,就是说毁掉它再毁掉任何一条新边都好,树都不会断裂。所以我们只要统计被覆盖过零次或一次的边即可。覆盖过零次的边,拆掉以后还能再拆任意一条新边,所以cnt+=m。覆盖过一次的边,拆掉后必须拆掉覆盖它的那个边,所以cnt++。剩下的就是求lca了。然而用nlogn的lca求法居然会超时。。所以只能用tarjan。
#include <cctype>
#include <cstdio>
using namespace std;
const int maxn=1e5+5, maxm=1e5+5;
struct Graph{
struct Edge{
int to, next; Graph *bel;
inline int operator *(){ return to; }
Edge& operator ++(){
return *this=bel->edge[next]; }
};
void addedge(int x, int y){
Edge &e=edge[++cntedge];
e.to=y; e.next=fir[x];
e.bel=this; fir[x]=cntedge;
}
Edge& getlink(int x){
return edge[fir[x]]; }
Edge edge[maxm*2];
int cntedge, fir[maxn];
}g, g2;
inline int getint(){
char c; int re=0, flag=1;
for (c=getchar(); !isdigit(c); c=getchar())
if (c=='-') flag=-1;
for (re=c-48; c=getchar(), isdigit(c); re=re*10+c-48);
return re*flag;
}
int n, m, visit[maxn], fa[maxn], add[maxn];
long long cnt;
int find(int x){
return fa[x]==x?x:fa[x]=find(fa[x]);
}
void tarjan(int now, int par){
Graph::Edge e=g2.getlink(now);
visit[now]=1;
for (; *e; ++e) if (visit[*e]){
add[find(*e)]-=2;
++add[now]; ++add[*e];
}
e=g.getlink(now);
//这个要写在后面!不然如果这个点的lca在它子树里,会算两遍
for (; *e; ++e){
if (*e==par) continue;
tarjan(*e, now);
fa[*e]=now;
}
}
int dfs(int now, int par){ //断开now上面的边
int v=add[now]; Graph::Edge e=g.getlink(now);
for (; *e; ++e){
if (*e==par) continue;
v+=dfs(*e, now);
}
if (now!=1){
if (v==0) cnt+=m;
if (v==1) ++cnt;
}
return v;
}
int main(){
scanf("%d%d", &n, &m); int x, y;
for (int i=1; i<=n; ++i) fa[i]=i;
for (int i=1; i<n; ++i){
x=getint(); y=getint();
g.addedge(x, y); g.addedge(y, x);
}
for (int i=1; i<=m; ++i){
x=getint(); y=getint();
if (x==y){ continue; }
g2.addedge(x, y);
g2.addedge(y, x);
}
tarjan(1, 0); dfs(1, 0);
printf("%lld\n", cnt);
return 0;
}
poj 3417 Network(tarjan lca)的更多相关文章
- POJ 3694 Network (tarjan + LCA)
题目链接:http://poj.org/problem?id=3694 题意是给你一个无向图n个点,m条边,将m条边连接起来之后形成一个图,有Q个询问,问将u和v连接起来后图中还有多少个桥. 首先用t ...
- poj 3417 Network (LCA,路径上有值)
题意: N个点,构成一棵树.给出这棵树的结构. M条边,(a1,b1)...(am,bm),代表给树的这些点对连上边.这样就形成了有很多环的一个新"树". 现在要求你在原树中断一条 ...
- 【题解】POJ 3417 Network(倍增求LCA+DP+树上差分)
POJ3417:http://poj.org/problem?id=3417 思路 我们注意到由“主要边”构成一颗树 “附加边”则是非树边 把一条附加边(x,y)加入树中 会与树上x,y之间构成一个环 ...
- POJ 3694 Network(Tarjan求割边+LCA)
Network Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 10969 Accepted: 4096 Descript ...
- Network(Tarjan+LCA)
http://poj.org/problem?id=3417 元宵节+情人节晚上刷的题,纪念一下.. 题意:给出n个点,m条边,然后Q个询问,每次询问输入一条边,输出加入此边后桥的个数.. #incl ...
- poj 3694 Network(割边+lca)
题目链接:http://poj.org/problem?id=3694 题意:一个无向图中本来有若干条桥,有Q个操作,每次加一条边(u,v),每次操作后输出桥的数目. 分析:通常的做法是:先求出该无向 ...
- poj 3417 树形dp+LCA
思路:我以前一直喜欢用根号n分段的LCA.在这题上挂了,第一次发现这样的LCA被卡.果断改用Tarjan离线算法求LCA. 当前节点为u,其子节点为v.那么: 当以v根的子树中含有连接子树以外点的边数 ...
- [poj 1144]Network[Tarjan求割点]
题意: 求一个图的割点. 输入略特别: 先输入图中点的总数, 接下来每一行首先给出一个点u, 之后给出一系列与这个点相连的点(个数不定). 行数也不定, 用0作为终止. 这样的输入还是要保证以数字读入 ...
- POJ 3417 Network
每条额外的边加入到图中,会导致树上一条路径成环,假设没有其余边,那么要将新图分成两部分,如果想删一条成环路径上的边,那么必须把这条额外边也删除. 因此每条额外边加入时,只需将环上的边+1.最后看看每条 ...
随机推荐
- Machine Learning in Action(4) Logistic Regression
从这节算是开始进入“正规”的机器学习了吧,之所以“正规”因为它开始要建立价值函数(cost function),接着优化价值函数求出权重,然后测试验证.这整套的流程是机器学习必经环节.今天要学习的话题 ...
- MySQL——sql语句的执行顺序
#核心知识点: 书写顺序:where——>group by——>having——>order by——>limit 许多时候在书写一些复杂的sql语句的时候,尤其是在渐进式推导 ...
- Vue:实践学习笔记(5)——Vue-Cli脚手架的使用
Vue:实践学习笔记(5)——Vue-Cli脚手架的使用 快速开始 项目配置 可视化配置 vue ui 命令配置 vue init webpack vue-demo(项目名) 运行测试 进入vue-d ...
- vs2012环境配置
快捷键 css格式设置 字体设置 新建项目 项目创建失败? 更改默认开发语言环境 1.快捷键 代码格式化:Ctrl+K+D 2.css格式设置: 工具→选项→文本编辑器→CSS→格式设置→选择“紧凑模 ...
- 郝健: Linux内存管理学习笔记-第1节课【转】
本文转载自:https://blog.csdn.net/juS3Ve/article/details/80035751 摘要 MMU与分页机制 内存区域(内存分ZONE) LinuxBuddy分配算法 ...
- CodeForces - 552E Vanya and Brackets —— 加与乘运算的组合
题目链接:https://vjudge.net/contest/224393#problem/E Vanya is doing his maths homework. He has an expres ...
- vs2015professional过期后登录微软账户仍然不能使用的解决方法
今天安装了vs2015pro版,找到了一个可以正常使用的密钥 2015 pro(专业版)key:HMGNV-WCYXV-X7G9W-YCX63-B98R2 注意是专业版,非企业版 来源:https:/ ...
- Sysctl命令及linux内核参数调整
一.Sysctl命令用来配置与显示在/proc/sys目录中的内核参数.如果想使参数长期保存,可以通过编辑/etc/sysctl.conf文件来实现. 命令格式: sysctl [-n ...
- CentOS 6以下版本 支持Ext4
CentOS默认是不支持Ext4.所以你需要处理一下才行. 使用环境使用的是CentOS5.8 内核是 2.6.18-238.19.1.el5 其实CentOS 5.8 里面是有 ext4 模块的, ...
- C++与UnrealScript脚本交互
转自:http://m.blog.csdn.net/blog/qweewqpkn/39932499 一.c++调用uc脚本中的函数 举例: 1. 在脚本MenuManager.uc文件中实现函数: e ...