题意:

      给你一棵树和m条边,问你在这些边里面最多能够挑出多少条边,使得这些边之间不能相互交叉。

思路:

     lca+贪心,首先对于给的每个条边,我们用lca求出他们的公共节点,然后在公共节点的深度排序,排序之后我们先从最深的开始,每次判断当前的这条边的两点是否用过,如果没用过,那么就把以当前两点的公共点为树根的子树全部标记上,然后答案+1,就这样一直遍历到最后就行了,一开始敲了一个,TLE了,各种优化之后还是TLE了,最后没办法了,用了一下自己存的一个LCA的模板,这个比我自己写的LCA快,所以就AC了,思路就是贪心+LCA。

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm> #define MAXN 110000
#define MAXM 210000

using namespace
std;
//*********************************************************
int n;
struct
EDGE
{
int
v, next, w;
}
edge[MAXM];
int
head[MAXN], e;
int
index, tmpdfn;
int
f[2 * MAXN], id[MAXN], vis[MAXN], pos[MAXN], dis[MAXN];
int
mi[2 * MAXN][18];
void
init()
{

memset(head, -1, sizeof(head));
e = 0;
index = tmpdfn = 0;
memset(vis, 0, sizeof(vis));
dis[1] = 0;
}
void
add(int u, int v, int w)
{

edge[e].v = v;
edge[e].w = w;
edge[e].next = head[u];
head[u] = e++;
}
void
dfs(int u)
{

vis[u] = 1;
int
tmp = ++tmpdfn;
f[++index] = tmp;
id[tmp] = u;
pos[u] = index;
for(int
i = head[u]; i != -1; i = edge[i].next)
{
int
v = edge[i].v;
if(!
vis[v])
{

dis[v] = dis[u] + edge[i].w;
dfs(v);
f[++index] = tmp;
}
}
}
void
rmqinit(int n, int *w)
{
for(int
i = 1; i <= n; i++) mi[i][0] = w[i];
int
m = (int)(log(n * 1.0) / log(2.0));
for(int
i = 1; i <= m; i++)
for(int
j = 1; j <= n; j++)
{

mi[j][i] = mi[j][i - 1];
if(
j + (1 << (i - 1)) <= n) mi[j][i] = min(mi[j][i], mi[j + (1 << (i - 1))][i - 1]);
}
}
int
rmqmin(int l,int r)
{
int
m = (int)(log((r - l + 1) * 1.0) / log(2.0));
return
min(mi[l][m] , mi[r - (1 << m) + 1][m]);
}
int
LCA(int l, int r)
{
if(
pos[l] > pos[r]) swap(l, r);
int
ans = rmqmin(pos[l], pos[r]);
return
id[ans];
}

//**********************************************************
typedef struct
{
int
a ,b ,ggdeep ,lca;
}
EDGEE; EDGEE edgee[110000]; bool camp(EDGEE a ,EDGEE b)
{
return
a.ggdeep > b.ggdeep;
} int
use[110000]; void mk_dfs(int x)
{

use[x] = 1;
for(int
k = head[x] ;k + 1 ;k = edge[k].next)
{
int
to = edge[k].v;
if(
use[to] || dis[x] + 1 != dis[to]) continue;
mk_dfs(to);
}
} int main()
{
int
u, v, w, l, r ,m;
while(~
scanf("%d%d", &n, &m))
{
init();
for(int
i = 1 ;i < n ;i ++)
{

scanf("%d %d" ,&u ,&v);
add(u ,v ,1);
add(v ,u ,1);
}
for(int
i = 1 ;i <= m ;i ++)
scanf("%d %d" ,&edgee[i].a ,&edgee[i].b);
dfs(1);
rmqinit(index, f);
for(int
i = 1 ;i <= m ;i ++)
{
int
lca = LCA(edgee[i].a ,edgee[i].b);
edgee[i].ggdeep = dis[lca];
edgee[i].lca = lca;
}
sort(edgee + 1 ,edgee + m + 1 ,camp);
memset(use ,0 ,sizeof(use));
int
ans = 0;
for(int
i = 1 ;i <= m ;i ++)
{ if(
use[edgee[i].a] || use[edgee[i].b])
continue;

ans ++;
mk_dfs(edgee[i].lca);
}

printf("%d\n" ,ans);
}
return
0;
}

hdu4912 LCA+贪心的更多相关文章

  1. 【BZOJ-4082】Surveillance 树链剖分 LCA + 贪心

    4082: [Wf2014]Surveillance Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 260  Solved: 100[Submit][ ...

  2. HDU 4912 LCA + 贪心

    题意及思路 说一下为什么按LCA深度从深到浅贪心是对的.我们可以直观感受一下,一条的路径会影响以这个lca为根的这颗树中的链,而深度越深,影响范围越小,所以先选影响范围小的路径. #include & ...

  3. HDU 4912 lca贪心

    Paths on the tree Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Othe ...

  4. ZOJ - 4048 Red Black Tree (LCA+贪心) The 2018 ACM-ICPC Asia Qingdao Regional Contest, Online

    题意:一棵树上有m个红色结点,树的边有权值.q次查询,每次给出k个点,每次查询有且只有一次机会将n个点中任意一个点染红,令k个点中距离红色祖先距离最大的那个点的距离最小化.q次查询相互独立. 分析:数 ...

  5. BZOJ 1787: [Ahoi2008]Meet 紧急集合(lca+贪心)

    [Ahoi2008]Meet 紧急集合 Description Input Output Sample Input 6 4 1 2 2 3 2 4 4 5 5 6 4 5 6 6 3 1 2 4 4 ...

  6. HDU 4912 Paths on the tree(LCA+贪心)

    题目链接 Paths on the tree 来源  2014 多校联合训练第5场 Problem B 题意就是给出m条树上的路径,让你求出可以同时选择的互不相交的路径最大数目. 我们先求出每一条路径 ...

  7. Codevs 1218 疫情控制 2012年NOIP全国联赛提高组

    1218 疫情控制 2012年NOIP全国联赛提高组 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description H 国有 n 个城市,这 ...

  8. 【Never Stop】联赛集训记录

    始于10/01/2017. Day I: T2图论,没想到.T3谜一样DP(是从来没意识到还可以这样). rank10. 下午刷了点题,CDQ也只打出一个板子,感觉自己不在状态? ========== ...

  9. 2017广东工业大学程序设计竞赛决赛 题解&源码(A,数学解方程,B,贪心博弈,C,递归,D,水,E,贪心,面试题,F,贪心,枚举,LCA,G,dp,记忆化搜索,H,思维题)

    心得: 这比赛真的是不要不要的,pending了一下午,也不知道对错,直接做过去就是了,也没有管太多! Problem A: 两只老虎 Description 来,我们先来放松下,听听儿歌,一起“唱” ...

随机推荐

  1. JavaScript中的事件循环机制跟函数柯里化

    一.事件循环机制的理解 test();//按秒输出5个5 function test() { for (var i = 0; i < 5; i++) { setTimeout(() => ...

  2. iot漏洞mips汇编基础

    1 基础概念 MIPS(Microprocessor without Interlocked Piped Stages architecture),是一种采取精简指令集(RISC)的处理架构,由MIP ...

  3. Graylog日志管理单机部署、日志节点的Sidecar配置以及简单的警告事件邮件发送

    应该是上个星期的上个星期,下了个任务,要做Graylog的部署以及文档,emmm....带log,肯定是和日志有关系了呗,不过也没听过啊,去搜了一下,确实,也不少帖子博客相关的都有安装部署,还是yum ...

  4. 【odoo14】第十五章、网站客户端开发

    odoo的web客户端.后台是员工经常使用的地方.在第九章中,我们了解了如何使用后台提供的各种可能性.本章,我们将了解如何扩展这种可能性.其中web模块包含了我们在使用odoo中的各种交互行为. 本章 ...

  5. UI透明欺诈

    判断是否存在的代码:   private static boolean c(Activity paramActivity)   {     List localList = ((ActivityMan ...

  6. java IO NIO BIO 最权威的总结

    1. BIO (Blocking I/O) 1.1 传统 BIO 1.2 伪异步 IO 1.3 代码示例 1.4 总结 2. NIO (New I/O) 2.1 NIO 简介 2.2 NIO的特性/N ...

  7. unbutu的dpkg被中断的解决办法

    直接sudo apt update进行重新配置就行

  8. python基础之基本数据类型与基本运算符

    一.基本数据类型 1.整数类型 作用:描述年龄.等级,电话号码等数据类型 age = 18 phone_number = 13572839204 2.浮点型 作用:描述薪资.身高等带小数的类型 hei ...

  9. 从阿里云迁移分布式redis实例到华为云解决方案(详细)

    如果要换多数是经济因素啦- 一. 准备工作 先在华为云上买一台redis数据库,配置一定要注意多数要保持一致,至于4.0还是5.0倒问题不大亲测兼容 可用区要找现有ECS云主机中的相同的机器.记下:这 ...

  10. KMP字符串匹配学习笔记

    部分内容引自皎月半洒花的博客 模式串匹配问题模型给定一个需要处理的文本串和一个需要在文本串中搜索的模式串,查询在该文本串中,给出的模式串的出现有无.次数.位置等.算法思想每次失配之后不会从头开始枚举, ...