题意:

      给你一棵树和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. 商品购买 & 收银台订单优化测试点疑问归纳梳理

    摘要 更新内容 更新人 更新时间 初版内容 Young 2020.11.20  16:40 贾轩审查确认 Harry 2020.11.20  17:00 和林森沟通问题答疑 参与人:林森.Harry. ...

  2. maven 常用命名

    maven项目,在命令行中操作,非常简洁.高效,现将maven项目常用命令行总结如下: maven命令行命令总结 序号 整理 统计 命令 作用 1 基本 5 mvn -v 查看maven版本 2 mv ...

  3. shiro太复杂?快来试试这个轻量级权限认证框架!

    前言 在java的世界里,有很多优秀的权限认证框架,如Apache Shiro.Spring Security 等等.这些框架背景强大,历史悠久,其生态也比较齐全. 但同时这些框架也并非十分完美,在前 ...

  4. 主成分分析 | Principal Components Analysis | PCA

    理论 仅仅使用基本的线性代数知识,就可以推导出一种简单的机器学习算法,主成分分析(Principal Components Analysis, PCA). 假设有 $m$ 个点的集合:$\left\{ ...

  5. mysql连接不上本地服务器或者localhost:3306报错

    今天初学MySQL数据库就遇到问题: 主要是本地服务器登录问题 workbench里双击那个connection出现的 解决方法: 1:看一看防火墙,这是最常见的,这种主要是防火墙限制了访问,可能是安 ...

  6. CodeForces571A. Lengthening Sticks(组合数学-容斥)

    题目大意: a,b,c三根木棍可以增加三个不同的数字,aa,bb,cc,且aa+bb+cc<=L,问能构成三角形的木棒有多少种方案 题目思路: 如果我们直接考虑把L分配给aa,bb,cc好像不好 ...

  7. 学习笔记-json数据格式化

    标准的json : let result=[{"a": 'aa', "b": 'aa', "c": 'aa'}, {"a" ...

  8. Jmeter(四十二) - 从入门到精通进阶篇 - Jmeter配置文件的刨根问底 -番外篇(详解教程)

    1.简介 为什么宏哥要对Jmeter的配置文件进行一下讲解了,因为有的童鞋或者小伙伴在测试中遇到一些需要修改配置文件的问题不是很清楚也不是很懂,就算修改了也是模模糊糊的.更有甚者觉得那是禁地神圣不可轻 ...

  9. 翻译:《实用的Python编程》08_01_Testing

    目录 | 上一节 (7.5 装饰方法 | 下一节 (8.2 日志) 8.1 测试 多测试,少调试(Testing Rocks, Debugging Sucks) Python 的动态性质使得测试对大多 ...

  10. OO第一单元总结与反思

    OO第一单元总结与反思 目录 OO第一单元总结与反思 摘要 第一次作业 本次作业UML类图 本次作业度量分析 第二次作业 本次作业的UML类图 本次作业的度量分析 第三次作业 本次作业的UML类图: ...