本文转载:http://www.cnblogs.com/YoungNeal/p/8530398.html

题目大意:

给定一棵树,有 n-1 条树边,m 条非树边,有两次割边的机会,第一次只能割树边,第二次只能割非树边,问有多少种方案使得两次之后树分为两个部分?

题解: 我们称每条非树边 (x,y) 都把树上 x,y 之间的路径上的每条边“覆盖了一次”。我们只需统计出每条树边被覆盖了次数。若第一步把覆盖 0 次的树边切断,则第二步可以任意切断一条非树边。若第一步把被覆盖 1 次的树边切断,则第二次方法唯一。若第一步把被覆盖 2 次及以上的树边切断,那么第二步无解。

所以我们接下来要解决的问题模型是:给定一张无向图和一颗生成树,求每条“树边”被“非树边”覆盖了多少次。

解决此问题有一个经典做法,我们称之为“树上差分算法”。我们给每个节点一个初始为 0 的权值,然后对每条非树边 (x,y) ,令节点 x 的权值加 1,节点 y 的权值加 1,节点 LCA(x,y) 的权值减 2。最后对这棵生成树进行一次深度优先遍历,求出 F[x] 表示以 x 为根的子树中各节点权值的和。F[x] 就是 x 与它的父节点之间的“树边”被覆盖的次数。时间复杂度 O(N+M)。

                     --《算法竞赛进阶指南》 注意最后求 ans 时,要从 2 开始,因为 1 的权值一定为 0。

(求树上路径被覆盖次数都可以采用树上差分)

代码:

#include<cstdio>
#include<cstring>
#define N 100005
#define int long long
using namespace std;bool vis[N];
int head[N];
int cf[N],q[N];
int n,m,cnt,ans;
int d[N],f[N][30];struct Edge{int to,nxt;
}edge[N<<1];void add(int x,int y){edge[++cnt].to=y;edge[cnt].nxt=head[x];head[x]=cnt;
}void dfs(int now){for(int i=head[now];i;i=edge[i].nxt){int to=edge[i].to;if(d[to]) continue;d[to]=d[now]+1;f[to][0]=now;for(int k=1;k<=21;k++)f[to][k]=f[f[to][k-1]][k-1];dfs(to);}
}int lca(int x,int y){if(d[x]<d[y]) x^=y^=x^=y;for(int k=21;~k;k--){if(d[f[x][k]]>=d[y]) x=f[x][k];}if(x==y) return y;for(int k=21;~k;k--){if(f[x][k]!=f[y][k])x=f[x][k],y=f[y][k];}return f[x][0];
}void dfs2(int now){vis[now]=1;for(int i=head[now];i;i=edge[i].nxt){int to=edge[i].to;if(!vis[to]){dfs2(to);cf[now]+=cf[to];}}
}signed main(){scanf("%lld%lld",&n,&m);for(int x,y,i=1;i<n;i++){scanf("%lld%lld",&x,&y);add(x,y);add(y,x);}d[1]=1;dfs(1);for(int x,y,i=1;i<=m;i++){scanf("%lld%lld",&x,&y);cf[x]++,cf[y]++;cf[lca(x,y)]-=2;}dfs2(1);for(int i=2;i<=n;i++){if(cf[i]==0) ans+=m;if(cf[i]==1) ans++;}printf("%lld",ans);return 0;
}

 

转载于:https://www.cnblogs.com/Miracevin/p/9031509.html

POJ 3417 Network相关推荐

  1. POJ - 3417 Network(树上差分)

    题目链接:点击查看 题目大意:(摘自大蓝书)Dark是人类内心的黑暗的产物,古今中外的勇者们都试图打倒它.经过研究,你发现Dark呈现无向图的结构,图中有N个节点和两类边,一类边被称为主要边,而另一类 ...

  2. POJ - 3417 Network LCA+树上差分

    思路:首先来说,给一个树加一条边肯定要构成一个环,我们假设加了该边后产生的环上的每一条边都累计加一. 假设这条边是a到b,那么其实就是原树a->lca(a,b)到b->lca(a,b)上的 ...

  3. 【割边缩点】解题报告:POJ - 3694 - Network(Tarjan割边缩点 + LCA + 并查集优化)

    POJ - 3694 - Network 给定一张N个点M条边的无向连通图,然后执行Q次操作,每次向图中添加一条边,并且询问当前无向图中"桥"的数量.N≤105,M≤2∗105,Q ...

  4. POJ 1236 Network of Schools(强连通 Tarjan+缩点)

    POJ 1236 Network of Schools(强连通 Tarjan+缩点) ACM 题目地址:POJ 1236 题意:  给定一张有向图,问最少选择几个点能遍历全图,以及最少加入�几条边使得 ...

  5. [tarjan] poj 1236 Network of Schools

    主题链接: http://poj.org/problem?id=1236 Network of Schools Time Limit: 1000MS   Memory Limit: 10000K To ...

  6. POJ 1236 Network of Schools(tarjan)

    Network of Schools Description A number of schools are connected to a computer network. Agreements h ...

  7. POJ - 1236 Network of Schools

    A number of schools are connected to a computer network. Agreements have been developed among those ...

  8. POJ 1144 Network(无向图连通分量求割点)

    题目地址:POJ 1144 求割点.推断一个点是否是割点有两种推断情况: 假设u为割点,当且仅当满足以下的1条 1.假设u为树根,那么u必须有多于1棵子树 2.假设u不为树根.那么(u,v)为树枝边. ...

  9. POJ 1236 Network of Schools(强连通分量缩点求根节点和叶子节点的个数)

    Description: A number of schools are connected to a computer network. Agreements have been developed ...

最新文章

  1. Technavio:大数据即服务将迎快速增长期
  2. vb中多个串口通讯_VB中的42个关键字,你知道都是哪些吗?
  3. C语言课程设计报告输出杨辉三角,C语言学习:在屏幕上输出杨辉三角
  4. [css] css中class和id选择器有什么区别?
  5. Android recycleview实现混合itemview,以及recycleview添加头部尾部
  6. oracle查询表字段和备注,Oracle 查询表信息(字段+备注)
  7. 计算机位图字节怎么算,位图跨度和4个字节的关系?(Bitmap Stride And 4 bytes Relation?)...
  8. python爬虫怎么写多线程_Python爬虫【第3篇】【多线程】
  9. 在Java中调用与系统有关的剪切板Clipboard
  10. windows server2012 domain user权限配置
  11. 【翻译】MobileWeb开发的性能调优技巧
  12. 基于GD库的php验证码类(支持中英文字体、背景、干扰点线、扭曲…….)
  13. java获取本周日_java获取本周 上周的所有日期
  14. go浏览器java_GO浏览器JAVAWP版下载_GO浏览器JAVA2016最新版_GO浏览器JAVA1.2.2-华军软件园...
  15. 为什么我们的数据还不够开放?
  16. NVIDIA NCCL 源码学习(四)- 建图过程
  17. 初识MIMO(六):MU-MIMO的仿真
  18. CAD如何使用圆命令做辅助线绘制梯形图案呢?
  19. python网络爬虫——自学笔记1.用requests库爬取图片
  20. 零基础 学 python开发 (Genius套餐A) 四十一

热门文章

  1. js中的if与Java中的if_JS中的if和else的用法以及基础语法
  2. python3.7.2安装包_Win10下python 2.7与python 3.7双环境安装教程图解
  3. 如何检查php代码规范,用CodeSniffer检查PHP项目的代码规范
  4. python打地鼠游戏代码100行_PythonStudy_打地鼠游戏代码
  5. oracle监听 客户 实例,oracle 数据库实例 监听
  6. python开发专属表情包_Python开发个人专属表情包网站
  7. vim改变与选择字休大小的方法
  8. python or妙用
  9. **kwargs特有的作用
  10. 面试有没有看过spring源码_如何看Spring源码、Java每日六道面试分享,打卡第二天...