HDU 4912 LCA + 贪心
说一下为什么按LCA深度从深到浅贪心是对的。我们可以直观感受一下,一条的路径会影响以这个lca为根的这颗树中的链,而深度越深,影响范围越小,所以先选影响范围小的路径。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 100010;
int head[maxn], Next[maxn * 2], ver[maxn * 2], tot, f[maxn][20];
int deep[maxn], t;
struct Edge {
int u, v, lca, lca_deep;
bool operator < (const Edge& rhs) const {
return lca_deep > rhs.lca_deep;
}
};
Edge a[maxn];
bool v[maxn];
void add(int x, int y) {
ver[++tot] = y;
Next[tot] = head[x];
head[x] = tot;
}
queue<int> q;
void bfs() {
deep[1] = 1;
q.push(1);
while(!q.empty()) {
int x = q.front();
q.pop();
for (int i = head[x]; i; i = Next[i]) {
int y = ver[i];
if(deep[y]) continue;
deep[y] = deep[x] + 1;
f[y][0] = x;
for (int j = 1; j <= t; j++)
f[y][j] = f[f[y][j - 1]][j - 1];
q.push(y);
}
}
} int query(int x, int y) {
if(deep[x] > deep[y]) swap(x, y);
for (int i = t; i >= 0; i--) {
if(deep[f[y][i]] >= deep[x]) y = f[y][i];
}
if(x == y) return x;
for (int i = t; i >= 0; i--)
if(f[x][i] != f[y][i]) {
x = f[x][i], y = f[y][i];
}
return f[x][0];
} void dfs(int x, int fa) {
if(v[x]) return;
v[x] = 1;
for (int i = head[x]; i; i = Next[i]) {
int y = ver[i];
if(y == fa) continue;
dfs(y, x);
}
} int main() {
int n, m, x, y;
while(~scanf("%d%d", &n, &m)) {
t = (int)(log(n) / log(2)) + 1;
tot = 0;
for (int i = 1; i <= n; i++) {
head[i] = 0;
v[i] = 0;
for (int j = 0; j <= t; j++)
f[i][j] = 0;
deep[i] = 0;
}
// memset(head, 0, sizeof(head));
// memset(f, 0, sizeof(f));
// memset(v, 0, sizeof(v));
// memset(deep, 0, sizeof(deep));
// tot = 0;
for (int i = 1; i < n; i++) {
scanf("%d%d", &x, &y);
add(x, y);
add(y, x);
}
bfs();
int ans = 0;
for (int i = 1; i <= m; i++) {
scanf("%d%d", &a[i].u, &a[i].v);
a[i].lca = query(a[i].u, a[i].v);
a[i].lca_deep = deep[a[i].lca];
}
sort(a + 1, a + 1 + m);
for (int i = 1; i <= m; i++) {
if(!v[a[i].u] && !v[a[i].v]) {
ans++;
dfs(a[i].lca, f[a[i].lca][0]);
}
}
printf("%d\n", ans);
}
}
HDU 4912 LCA + 贪心的更多相关文章
- HDU 4912 lca贪心
Paths on the tree Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Othe ...
- HDU 2586 + HDU 4912 最近公共祖先
先给个LCA模板 HDU 1330(LCA模板) #include <cstdio> #include <cstring> #define N 40005 struct Edg ...
- hdu 4912 Paths on the tree(树链拆分+贪婪)
题目链接:hdu 4912 Paths on the tree 题目大意:给定一棵树,和若干个通道.要求尽量选出多的通道,而且两两通道不想交. 解题思路:用树链剖分求LCA,然后依据通道两端节点的LC ...
- Hdu 4864(Task 贪心)(Java实现)
Hdu 4864(Task 贪心) 原题链接 题意:给定n台机器和m个任务,任务和机器都有工作时间值和工作等级值,一个机器只能执行一个任务,且执行任务的条件位机器的两个值都大于等于任务的值,每完成一个 ...
- D - 淡黄的长裙 HDU - 4221(贪心)
D - 淡黄的长裙 HDU - 4221(贪心) James is almost mad! Currently, he was assigned a lot of works to do, so ma ...
- hdu4912 LCA+贪心
题意: 给你一棵树和m条边,问你在这些边里面最多能够挑出多少条边,使得这些边之间不能相互交叉. 思路: lca+贪心,首先对于给的每个条边,我们用lca求出他们的公共节点,然后在 ...
- HDU 4912 Paths on the tree(LCA+贪心)
题目链接 Paths on the tree 来源 2014 多校联合训练第5场 Problem B 题意就是给出m条树上的路径,让你求出可以同时选择的互不相交的路径最大数目. 我们先求出每一条路径 ...
- hdu 4912 Paths on the tree(lca+馋)
意甲冠军:它使树m路径,当被问及选择尽可能多的路径,而这些路径不相交. 思考:贪心,比較忧伤.首先求一下每对路径的lca.依照lca的层数排序.在深一层的优先级高.那么就能够贪心了,每次选择层数最深的 ...
- hdu 2037简单贪心--活动安排问题
活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合,是可以用贪心算法有效求解的很好例子.该问题要求高效地安排一系列争用某一公共资源的活动.贪心算法提供了一个简单.漂亮的方法使得尽可能多的活动 ...
随机推荐
- c# 打开第三方软件(如:电脑自带看图软件)
嘿嘿,直接上示例代码 /// <summary> /// 利用第三方软件浏览加工图纸 /// </summary> /// <param name="fileP ...
- Beautifusoup
text = soup.find('div', {'class': 'mulu'}) #查找目录,坑死我了.就这个东西,知乎上看别人写的爬取网络小说,这个最适合我.我一开始老是使用beautifuls ...
- 项目管理理论与实践(4)——UML应用(上)
本篇文章介绍UML的相关知识.参考<UML从入门到精通> 一.UML综述 1. UML简介 统一建模语言(UML)是一个通用的可视化建模语言,用于对软件进行描述.可视化处理.构造和建立软件 ...
- dilworth定理的通俗讲解
度娘定义:在数学理论中的序理论与组合数学中,Dilworth定理根据序列划分的最小数量的链描述了任何有限偏序集的宽度.其名称取自数学家Robert P. Dilworth. 反链是一种偏序集,其任意两 ...
- IE9 placeholder 不兼容的解决
坑爹的IE9-,真的是够够的了,不过公司不要求兼容这个玩意了,自己觉得兼容这个鬼还是挺有挑战性的,自己也碰到不少难题,一个个解决. css: .placeholderColor { color : # ...
- SQL夯实基础(六):MqSql Explain
关系型数据库中,互联网相关行业使用最多的无疑是mysql,虽然我们C# Developer很多用的都是sql server ,但是学习一些mysql方面的知识也是必要的,他山之石么. 先上一个expl ...
- 寻找数组中第K大数
1.寻找数组中的第二大数 using System; using System.Collections.Generic; using System.Linq; using System.Text; u ...
- TP上传图片
//更新 更新中的话,一定要写那一个if判断 public function update(){ $model = M('link'); $upload = new \Think\Upload();/ ...
- 【转】探秘Java中的String、StringBuilder以及StringBuffer
探秘Java中String.StringBuilder以及StringBuffer 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问到的地方,今天就来和大家一起学习一 ...
- 新的开发域名 fastadmin.tk
新的开发域名 fastadmin.tk 这个的所有子域名批向 127.0.0.1,可以用于开发. 以后不用再修改系统的 hosts. 使用案例 手把手教你安装 FastAdmin 到虚拟主机 (php ...