题意:

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. fontawesome图标不显示的原因

    1.查看css路径是否正确 2.查看font文件夹内的字体文件是否引入 3.查看font文件夹内的字体资源路径是否正确

  2. yapi 事件创建、修改等接口事件监听

    使用的yapi作为接口文档平台.出于业务需求需要对接口创建.修改.删除等事件进行监听. yapi已经实现并预留了这个口子,但是没有找到实现的文档.这里进行简单描述下使用的方式. 一.yapi创建.修改 ...

  3. 取得get参数 从url

    1. getUrlParam.js define(function() { // url参数 var data, index; (function init() { data = []; index ...

  4. requests接口测试-requests的安装

    requests接口测试-requests的安装 安装常见问题 提示连接不上,443问题 一般是因为浏览器设置了代理,关闭代理. 网络加载慢,设置国内镜像地址 1.pip安装 2.pycharm安装 ...

  5. bzoj#2407-探险【最短路,二进制分组】

    正题 题目链接:https://darkbzoj.tk/problem/2407 题目大意 \(n\)个点的一张无向图(但是正反权值不同),求一个从\(1\)出发回到\(1\)且不经过重复边的最短路径 ...

  6. Redis高可用解决方案:哨兵(Sentinel)

    哨兵是Redis的高可用解决方案:由多个哨兵组成的系统监视主从服务器,可以将下线的主服务器属下的某个从服 务器升级为新的主服务器,继续保障运行. 启动并初始化Sentinel redis-sentin ...

  7. C++ 可变数组实现

    话不多说,直接上代码,看注释 template<class T> // 支持传入泛型,但string这种可变长度的类型还不支持 class Array { int mSize = 0, m ...

  8. Win10连WiFi显示无internet,安全 却可以正常上网

    1.现象: win10连WiFi显示无internet,安全 可以正常上网 2.原因: Wind10升级系统补丁后,更新了系统检查是否联网的注册表配置,新的域名在国内存在无法连接情况.导致此问题发生 ...

  9. Vue自定义页面路由

    错误1:webpackEmptyContext (eval at ./src/store/modules sync recursive (0.js:10), <anonymous>:2:1 ...

  10. 洛谷4630APIO2018铁人两项(圆方树+dp)

    QWQ神仙题啊(据说是今年第一次出现圆方树的地方) 首先根据题目,我们就是求对于每一个路径\((s,t)\)他的贡献就是两个点之间的点数,但是图上问题我并没有办法很好的解决... 这时候考虑圆方树,我 ...