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简单贪心--活动安排问题
活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合,是可以用贪心算法有效求解的很好例子.该问题要求高效地安排一系列争用某一公共资源的活动.贪心算法提供了一个简单.漂亮的方法使得尽可能多的活动 ...
随机推荐
- New Concept English three (53)
30w/m 56errors The Scandinavian countries are much admired all over the world for their enlightened ...
- uva11729 - Commando War(贪心)
贪心法,执行任务的时间J越长的应该越先交待.可以用相邻交换法证明正确性.其实对于两个人,要让总时间最短,就要让同一时间干两件事的时间最长. #include<iostream> #incl ...
- 未定义的标示符“RECT”,引入了windows.h头文件也没有用?
我用的是win8的vs2012,RECT应该引入什么头文件?windows.h我第一个就引入了,去windows.h里面搜也搜不到RECT这个关键字,应该引入哪个头文件呢? 真是奇怪啊,是不是还需要什 ...
- 总结的一些MySQL数据库面试题
1.sql语句应该考虑哪些安全性? 1.防止sql注入,对特殊字符进行转义,过滤或者使用预编译的sql语句绑定变量. 2.最小权限原则,特别是不要用root账户,为不同的类型的动作或者组建使用不同的账 ...
- Mybatis中对于标签的配置可能不会出现自动提示解决方案
解决办法:引入mybatis-3-config.dtd 文件 Window-preferences-搜索xml-xml catalog <!DOCTYPE configuration PUBLI ...
- 学习动态性能表(16)--v$rowcache
学习动态性能表 第16篇--V$ROWCACHE 2007.6.12 本视图显示数据字典缓存(也叫rowcache)的各项统计.每一条记录包含不同类型的数据字典缓存数据统计,注意数据字典缓存有层次差 ...
- BZOJ1370:[Baltic2003]团伙
浅谈并查集:https://www.cnblogs.com/AKMer/p/10360090.html 题目传送门:https://lydsy.com/JudgeOnline/problem.php? ...
- 异常java.sql.SQLException: Field 'id' doesn't have a default value
使用spring data jpa出现这个情况. entity中的自增策略已经加好了. 还是出现这个异常.去数据库中查看,发现没有给主键加上自增. 出现这个问题去实体类跟数据库中看一下就可以了.
- linux find -regex 使用正则表达式
find之强大毋庸置疑,此处只是带领大家一窥find门径,更详细的说明见man find和 info find.整篇文章循序渐进,从最常用的文件名测试项开始步步深入,到第六节基本讲完find处理文件 ...
- C# Application Excel TreeView
三章 应用 20节客户表登陆 //动软--单表--Models --新建.net项目--简单三层管理--DBUtity--DbHelper.cs 21节客户表数据读取 增加 CEnterprise(企 ...