题意:

N个点,构成一棵树。给出这棵树的结构。

M条边,(a1,b1)...(am,bm),代表给树的这些点对连上边。这样就形成了有很多环的一个新”树“。

现在要求你在原树中断一条边,在M条边中断一条边,使得新”树“被分成两个部分。

问有多少种方案。

思路:

连上某条新边(a,b),则必定形成一个环。环的路径是a->...->lca(a,b)->...->b,给这些边的值都加1 。

分情况:

在原树中,若一条边的值>=2,去掉这条边,再去掉M条边中的一条,不影响原树的连通性。方案数为0。

       若一条边的值==1,去掉这条边,必须去掉这条边所在环的那条新边(M条边之一)。方案数为1。

     若一条边的值==0,去掉这条边,再随意去掉M条边中的一条,都会破坏原树的连通性。方案数为M。

在计算边的值时,采用DP的方式,若要将路径a->...->lca(a,b)->...->b上的边值都加1,则dp[a]++,dp[b]++,dp[lca(a,b)]-=2。

直接看代码。

代码:

int const maxn = 100005;

struct node{
int to,next,lca;
}; int fa[maxn];
bool vis[maxn];
int head[2*maxn];
int qhead[2*maxn]; node edge[maxn*2];
node qedge[maxn*2]; int n,m,cnt1,cnt2,cn;
int dp[maxn], edgeCount[maxn]; inline void Addedge(int u,int v){
edge[++cnt1].to=v;
edge[cnt1].next=head[u];
head[u]=cnt1; edge[++cnt1].to=u;
edge[cnt1].next=head[v];
head[v]=cnt1;
}
inline void Addqedge(int u,int v){
qedge[++cnt2].to=v;
qedge[cnt2].next=qhead[u];
qhead[u]=cnt2; qedge[++cnt2].to=u;
qedge[cnt2].next=qhead[v];
qhead[v]=cnt2;
}
void init(){
mem(head,-1); mem(qhead,-1); mem(vis,false);
rep(i,1,n) fa[i]=i;
cnt1=cnt2=0;
}
int findFa(int x){
return fa[x]==x?x:fa[x]=findFa(fa[x]);
}
void Tarjan_LCA(int u){
fa[u]=u;
vis[u]=true;
for(int i=head[u];i!=-1;i=edge[i].next){
if(!vis[edge[i].to]){
Tarjan_LCA(edge[i].to);
fa[edge[i].to]=u;
}
} for(int i=qhead[u];i!=-1;i=qedge[i].next){
if(vis[qedge[i].to])
qedge[i].lca=findFa(qedge[i].to);
}
}
int dfsDp(int u,int fa){
for(int i=head[u];i!=-1;i=edge[i].next){
int v=edge[i].to; if(v==fa) continue;
int t1=dfsDp(v,u);
edgeCount[++cn]=t1;
dp[u]+=t1;
}
return dp[u];
} int a,b;
int main(){
while(scanf("%d%d",&n,&m)!=EOF){
init();
rep(i,1,n-1){
scanf("%d%d",&a,&b);
Addedge(a,b);
}
mem(dp,0);
rep(i,1,m){
scanf("%d%d",&a,&b);
Addqedge(a,b);
dp[a]++; dp[b]++;
}
Tarjan_LCA(1);
for(int i=1;i<=cnt2;i+=2){
dp[qedge[i].lca]-=2;
}
mem(edgeCount,0);
cn=0;
dfsDp(1,-1);
int ans=0;
rep(i,1,cn){
if(edgeCount[i]==1)
ans++;
else if(edgeCount[i]==0)
ans+=m;
}
printf("%d\n",ans);
}
}

poj 3417 Network (LCA,路径上有值)的更多相关文章

  1. poj 3417 Network(tarjan lca)

    poj 3417 Network(tarjan lca) 先给出一棵无根树,然后下面再给出m条边,把这m条边连上,然后每次你能毁掉两条边,规定一条是树边,一条是新边,问有多少种方案能使树断裂. 我们设 ...

  2. SPOJ COT2 树上找路径上不同值的个数

    题目大意 给出多个询问u , v , 求出u-v路径上点权值不同的个数 开始做的是COT1,用主席树写过了,理解起来不难 很高兴的跑去做第二道,完全跟普通数组区间求k个不同有很大区别,完全没思路 膜拜 ...

  3. POJ 3417 Network

    每条额外的边加入到图中,会导致树上一条路径成环,假设没有其余边,那么要将新图分成两部分,如果想删一条成环路径上的边,那么必须把这条额外边也删除. 因此每条额外边加入时,只需将环上的边+1.最后看看每条 ...

  4. poj 3417 Network 题解

    题意: 先给出一棵树,然后再给出m条边,把这m条边连上,然后剪掉两条边,一条是原边,一条是新边,问有多少种方案能使图不连通. 思路: 从原边的角度看 1.树加边,一定成环,加一条(u,v)边就有u-& ...

  5. 【题解】POJ 3417 Network(倍增求LCA+DP+树上差分)

    POJ3417:http://poj.org/problem?id=3417 思路 我们注意到由“主要边”构成一颗树 “附加边”则是非树边 把一条附加边(x,y)加入树中 会与树上x,y之间构成一个环 ...

  6. Network POJ - 3417(LCA+dfs)

    Yixght is a manager of the company called SzqNetwork(SN). Now she's very worried because she has jus ...

  7. hdu-3078 Network(lca+st算法+dfs)

    题目链接: Network Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Others) P ...

  8. 牛客网 桂林电子科技大学第三届ACM程序设计竞赛 D.寻找-树上LCA(树上a到b的路径上离c最近的点)

    链接:https://ac.nowcoder.com/acm/contest/558/D来源:牛客网 寻找 小猫在研究树. 小猫在研究树上的距离. 给定一棵N个点的树,每条边边权为1. Q次询问,每次 ...

  9. CF E2 - Daleks' Invasion (medium) (LCA求两点树上路径上的最大边权)

    http://codeforces.com/contest/1184/problem/E2 题意:给出一副图,首先求出这幅图的最小生成树 , 然后修改这幅图上不属于最小生成树的边权,使得修改后的图在求 ...

随机推荐

  1. Jmeter系列(11)- 自动化压力测试逻辑思路及例子

    为什么需要进行自动化压力测试 手动逐步加压,需要人工改变并发数,还要等待.所有,我们完全可以制定好策略,让程序自动加压,自动等待,输出报告 实现思路 Jmeter脚本(.jmx文件)- 压测逻辑 Sh ...

  2. 在eclipse上配置tomcat(包括解决找不到server,配置8.0以上版本)

    下载安装eclipse普通eclipse最多只支持到tomcat v 7,要想使用8以上的tomcat,就需要下载最新版本的Eclipse IDE,安装时 选择 Eclipse IDE for Ent ...

  3. 制作python程序windows安装包(飞机大战源码)

    本文以飞机大战源码为例: 1.首先使用pyinstaller -w xxx.py打包   -w的意思是不显示命令行:飞机大战源码由多个.py文件以及一些图片,音乐文件组成,我们将main.py打包, ...

  4. hadoop生态之面试题篇

    一.hdfs的高可用 1.先说下自己的理解, 正常的hdfs有namenode,datanode,secondnamenode,但是second name node 不是真正意义上的namenode备 ...

  5. 对代理IP进行检测是否可用

    第一种方法是使用telnetlib import telnetlib import requests from lxml import etree #解析此url页面的IP url = 'http:/ ...

  6. 简单介绍session,cookie,token以及区别

    Cookie简介 ①.是由服务器发给客户端的特殊信息,以文本的形式存放在客户端 ②.客户端再次请求的时候,会把Cookie回发给服务器 ③.服务器接收到后,会解析Cookie生成与客户端相对应的内容 ...

  7. oracle查看和修改session和最大连接数

    第一步,在cmd命令行,输入sqlplus 第二步,根据提示输入用户名与密码 1. 查看processes和sessions参数 SQL> show parameter processes NA ...

  8. NOIP&CSP 考前 Dev-cpp 的选项问题和考试心态

    (进入考场后您将获得一个崭新的 \(Dev-cpp\),没有中文,没有编译选项,没有缺省源:我还将获得一个崭新的脑子,没有心态,没有智商,没有调试能力--) 中文 \[Step1 \] \[Step2 ...

  9. C++ IDE或编辑器安装

    IDE介绍 上节课我们讲了C++编译器,可是没有好的编辑器,只用记事本打代码,这谁受得了.Linux vim至少还有代码高亮(即我作文里经常会出现的"彩色的代码"),记事本连高亮都 ...

  10. yum源安装nginx

    nginx使用yum源安装 安装步骤 使用yum源安装依赖 yum install yum-utils 配置nginx.repo的yum文件 vim /etc/yum.repos.d/nginx.re ...