POJ3417Network
| Time Limit: 2000MS | Memory Limit: 65536K | |
| Total Submissions: 5311 | Accepted: 1523 |
Description
Yixght is a manager of the company called SzqNetwork(SN). Now she's very worried because she has just received a bad news which denotes that DxtNetwork(DN), the SN's business rival, intents to attack the network of SN. More unfortunately, the original network of SN is so weak that we can just treat it as a tree. Formally, there are N nodes in SN's network, N-1 bidirectional channels to connect the nodes, and there always exists a route from any node to another. In order to protect the network from the attack, Yixght builds M new bidirectional channels between some of the nodes.
As the DN's best hacker, you can exactly destory two channels, one in the original network and the other among the M new channels. Now your higher-up wants to know how many ways you can divide the network of SN into at least two parts.
Input
The first line of the input file contains two integers: N (1 ≤ N ≤ 100 000), M (1 ≤ M ≤ 100 000) — the number of the nodes and the number of the new channels.
Following N-1 lines represent the channels in the original network of SN, each pair (a,b) denote that there is a channel between node a and node b.
Following M lines represent the new channels in the network, each pair (a,b) denote that a new channel between node a and node b is added to the network of SN.
Output
Output a single integer — the number of ways to divide the network into at least two parts.
Sample Input
4 1
1 2
2 3
1 4
3 4
Sample Output
3
Source
从链的情况开始,红色的边为非树边。首先看1--2这条边,没有任何非树边覆盖,所以要删这条边,
你删任何一条树边都可以,所以这条边对答案的贡献是m。再看4--5这条边,被一条非树边覆盖,如果
删去这条边并且再删去一条非树边,想要使图不连通,只能删覆盖它的非树边,所以当只有一条非树边
覆盖这条边时,这条边对答案的贡献是1。再看2--3这条边,如果删去这条边,想要使图不连通,你删哪条
非树边都是没有用的,图仍会连通。对答案产生贡献的树边的条件是,如果没有被非树边覆盖,产生的
贡献是m,如果被一条非树边覆盖,产生的贡献就是1,即删掉覆盖它的非树边,如果被2及其以上的非树
边覆盖,对答案没有贡献,你删那一条非树边图仍然连通。
好了,我们已经讨论完答案的产生,在说明怎样实现。
进行树上差分来实现每一条树边被几条非树边覆盖。
当一条非树边的端点为u,v时,查分数组dp[u]++,dp[v]++,dp[lca(u,v)]-=2.
然后在dfs一遍求差分数组的后缀和,dp[i]表示i和它父亲相连的这条边被几条非树边覆盖。
最后统计答案即可。
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 100002
using namespace std; int n,m,sumedge,ans;
int head[maxn],top[maxn],deep[maxn],dad[maxn],size[maxn],dp[maxn]; struct Edge{
int x,y,nxt;
Edge(int x=,int y=,int nxt=):
x(x),y(y),nxt(nxt){}
}edge[maxn<<]; void add(int x,int y){
edge[++sumedge]=Edge(x,y,head[x]);
head[x]=sumedge;
} void dfs(int x){
size[x]=;deep[x]=deep[dad[x]]+;
for(int i=head[x];i;i=edge[i].nxt){
int v=edge[i].y;
if(v==dad[x])continue;
dad[v]=x;
dfs(v);
size[x]+=size[v];
}
} void dfs_(int x){
int s=;
if(!top[x])top[x]=x;
for(int i=head[x];i;i=edge[i].nxt){
int v=edge[i].y;
if(v!=dad[x]&&size[v]>size[s])s=v;
}
if(s){
top[s]=top[x];
dfs_(s);
}
for(int i=head[x];i;i=edge[i].nxt){
int v=edge[i].y;
if(v!=dad[x]&&v!=s)dfs_(v);
}
} int lca(int x,int y){
for(;top[x]!=top[y];){
if(deep[top[x]]>deep[top[y]])swap(x,y);
y=dad[top[y]];
}
if(deep[x]>deep[y])swap(x,y);
return x;
} void DP(int x){
for(int i=head[x];i;i=edge[i].nxt){
int v=edge[i].y;
if(v==dad[x])continue;
DP(v);
dp[x]+=dp[v];
}
} int main(){
scanf("%d%d",&n,&m);
for(int i=;i<n;i++){
int x,y;
scanf("%d%d",&x,&y);
add(x,y);add(y,x);
}
dfs();dfs_();
for(int i=;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
dp[x]++;dp[y]++;
dp[lca(x,y)]-=;
}
DP();
for(int i=;i<=n;i++){
if(dp[i]==)ans+=m;
else if(dp[i]==)ans++;
//cout<<dp[i]<<endl;
}
cout<<ans<<endl;
return ;
}
POJ3417Network的更多相关文章
- poj3417Network【LCA】【树形DP】
Yixght is a manager of the company called SzqNetwork(SN). Now she's very worried because she has jus ...
- POJ3417Network(LCA+树上查分||树剖+线段树)
Yixght is a manager of the company called SzqNetwork(SN). Now she's very worried because she has jus ...
随机推荐
- 物理cpu和逻辑cpu
1 物理cpu 插槽里面实际插入的cpu的个数. 通过不重复的physical id可以获取实际的物理cpu的个数. 2 逻辑cpu cat /proc/info processor 1 proces ...
- python中TCP和UDP区别
TCP(Transmission Control Protocol)可靠的.面向连接的协议(eg:打电话).传输效率低全双工通信(发送缓存&接收缓存).面向字节流.使用TCP的应用:Web浏览 ...
- Linux安装过程记录信息
全新的linux安装完成后,会在root目录下有一下三个文件,记录了Linux的安装细节 anaconda-ks.cfg 以Kickstart配置文件的格式记录安装过程中设置的选项信息 install ...
- TextView属性
TextView及其子类,当字符内容太长显示不下时可以省略号代替未显示的字符:省略号可以在显示区域的起始,中间,结束位置,或者以跑马灯的方式显示文字(textview的状态为被选中). 其实现只需在x ...
- linux 中 用户管理 (composer 时不能root 遇到)
linux 是支持多用户的,可以同时多个用户在线操作,这点与 Windows 不同. 在我们项目组 操作linux 服务器时,可进行多用户管理,并赋予不同权限,下面是我学习并用的比较频繁的命令: 1. ...
- 3django url name详解
打开urls.py from django.conf.urls import url from django.contrib import admin from calc import views a ...
- java程序实现Unicode码和中文互相转换
根据前一篇的补充问题http://blog.csdn.net/fancylovejava/article/details/10142391 有了前一篇文章的了解,大概了解了unicode编码格式了 ...
- 【leetcode刷题笔记】Unique Binary Search Trees II
Given n, generate all structurally unique BST's (binary search trees) that store values 1...n. For e ...
- JavaScript在执行代码之前会校验代码,声明变量提前至当前作用域最前面。
var name = 123; function getName(){ console.log(name); } getName(); 输出123 -------------------------- ...
- java入门了解11
1.码表 (一)码表种类 ASCII:美国标准信息交换码,用一个字节的7位可以表示 ISO8859-1:拉丁码表.欧洲码表,用一个字节的8位表示,对ASCII没用到空间补充了自己特有的 GB2312: ...