题目大意:

就是现在一个图, 其中n个点, n <= 20000, m条边, m <= 100000

其中一些边是石子路一些事乡村小路, 图保证石子路形成一棵树, 使得所有城市通过石子路能相同, 另外是一些乡村小路

现在要从图中删除一条石子路和一条乡村小路使得图变得不连通, 问有多少种删法

大致思路:

很明显是个树形DP, 对于每个石子路, 一旦被删除, 树就被切割成了一颗子树和该子树之外两个部分, 那么对应的删除乡村小路的方案就有3种情况:

1.这棵子树不和其他部分通过乡村小路相连, 那么删掉任意一条乡村小路即可

2. 这棵子树和其他部分通过1条小路相连, 那么对应删除的乡村小路只能是这条小路

3. 这棵子树和其他部分有2条或以上数量的小路相连, 那么这个状态下是没有可行方案的

于是树形DP维护一下当前子树下有多少条小路连接到该子树之外即可

要维护这个只需要对乡村小路两个端点求LCA即可, 判断他们的LCA是不是被当前子树包含住

由于每条乡村小路最多只会被询问两次LCA, 总体复杂度并不高

代码如下:

Result  :  Accepted     Memory  :  6796 KB     Time  :  154 ms

#include <map>
#include <cmath>
#include <queue>
#include <cstdio>
#include <string>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;#define maxn 20010
vector<int> G[maxn];
vector<int> H[maxn];
int n, m;
int st[2*maxn][20];
int pos[maxn];
int sum;
int dfn[maxn];
int fa[maxn];void add(int x)
{st[++sum][0] = x;pos[x] = sum;return;
}void dfs(int now, int father)
{int nex;for(int i = 0, sz = G[now].size(); i < sz; i++) if((nex = G[now][i]) != father){fa[nex] = now;add(now);dfn[nex] = dfn[now] + 1;dfs(nex, now);}add(now);return;
}int Min(int x, int y)
{return dfn[x] < dfn[y] ? x : y;
}void initLCA()
{for(int j = 1; (1 << j) <= sum; j++)for(int i = 1; i + (1 << j) - 1 <= sum; i++)st[i][j] = Min(st[i][j - 1], st[i + (1 << (j - 1))][j - 1]);return;
}int lca(int u, int v)
{u = pos[u], v = pos[v];if(u > v) swap(u, v);int k = 0;while((1 << (k + 1)) <= v - u + 1) k++;return Min(st[u][k], st[v - (1 << k) + 1][k]);
}int dp[maxn];int gao(int now, int father)
{int nex;int ret = 0;for(int i = 0, sz = G[now].size(); i < sz; i++) if((nex = G[now][i]) != father)ret += gao(nex, now);for(int j = 0, sz = H[now].size(); j < sz; j++){int z = lca(now, H[now][j]);if(z == now) ret--;else ret++;}return dp[now] = ret;
}int main(){freopen( "diversion.in" , "r" , stdin );freopen( "diversion.out" , "w" , stdout );scanf("%d %d", &n, &m);for(int i = 1; i <= n; i++)G[i].clear(), H[i].clear();int u, v, t;for(int i = 1; i <= m; i++){scanf("%d %d %d", &u, &v, &t);if(t == 1) G[u].push_back(v), G[v].push_back(u);else H[u].push_back(v), H[v].push_back(u);}fa[1] = -1;dfn[1] = sum = 0;dfs(1, -1);initLCA();gao(1, -1);int ans = 0;for(int i = 2; i <= n; i++)if(dp[i] == 0)ans += m;else if(dp[i] == 1)ans += 1;else ans += 0;printf("%d\n", ans);return 0;
}

Codeforces Gym 100339B Diversion 树形DP + LCA相关推荐

  1. [ACM]【树形DP/LCA】牛客练习赛62 牛牛染颜色

    牛牛染颜色 传送门 题意:给出一个有根树,求满足条件的染色方案的数目,条件:任意两个染黑的点的LCA必须也为黑点. 思路: 我一看到LCA就会想到自己还不会倍增的恐惧 很显然的树形DP.既然是DP,就 ...

  2. CodeForces - 1453E Dog Snacks(树形dp+贪心)

    题目链接:点击查看 题目大意:给出一棵有根树,现在需要选择一个最小的 k 值,可以满足下列的 n 次操作: 起始时位于点 1(根节点) 每一步选择一个未被遍历的节点中,距离最近的,且必须满足此距离小于 ...

  3. poj 3417 树形dp+LCA

    思路:我以前一直喜欢用根号n分段的LCA.在这题上挂了,第一次发现这样的LCA被卡.果断改用Tarjan离线算法求LCA. 当前节点为u,其子节点为v.那么: 当以v根的子树中含有连接子树以外点的边数 ...

  4. [概率期望][树形DP][LCA]JZOJ 5814 树

    Description 梦游中的你来到了一棵 N 个节点的树上. 你一共做了 Q 个梦, 每个梦需要你从点 u 走到 点 v 之后才能苏醒, 由于你正在梦游, 所以每到一个节点后,你会在它连出去的边中 ...

  5. 【HDU - 5452】Minimum Cut(树形dp 或 最近公共祖先lca+树上差分,转化tricks,思维)

    题干: Given a simple unweighted graph GG (an undirected graph containing no loops nor multiple edges) ...

  6. Codeforces Round #263 (Div. 2) D. Appleman and Tree 树形dp

    链接: http://codeforces.com/contest/462/problem/D 题意: 给定n个点的树, 0为根,下面n-1行表示每个点的父节点 最后一行n个数 表示每个点的颜色,0为 ...

  7. codeforces 816 E. Karen and Supermarket(树形dp)

    题目链接:http://codeforces.com/contest/816/problem/E 题意:有n件商品,每件有价格ci,优惠券di,对于i>=2,使用di的条件为:xi的优惠券需要被 ...

  8. 【Codeforces Round #614(div2)】E-Xenon's Attack on the Gangs(树形dp)

    一.题目链接 https://codeforces.com/contest/1293/problem/E 二.题意 给n个结点,n-1条无向边.即一棵树.我们需要给这n-1条边赋上0~n-2不重复的值 ...

  9. 【Christmas Game】【CodeCraft-21 and Codeforces Round #711 (Div. 2)】【Nim-博弈】【树形DP】【拆分树】

    CodeCraft-21 and Codeforces Round #711 (Div. 2) Christmas Game Nim-博弈 树形DP 拆分树 牛客链接 https://ac.nowco ...

  10. Codeforces 1088E Ehab and a component choosing problem(树形DP)

    Codeforces 1088E Ehab and a component choosing problem(树形DP) 题意 给一棵树,要求从中选一些联通分量,使得平均联通分量重量总和最大.如果有多 ...

最新文章

  1. 【高并发】面试官问我:为啥局部变量是线程安全的?
  2. navicat mysql 远程_Navicat for mysql 连接远程数据库
  3. 血型算法php,血型排行榜!(真的很准)
  4. 如何使用libxml2库[转]
  5. a12处理器怎么样_iPhone运行安卓系统卡成翔,苹果A系处理器彻底跌落神坛!
  6. Java 1.1.1字符串之子串
  7. seo该如何防止网站被挂***?!
  8. android 音乐播放器----歌词在线下载
  9. 2022年最佳的9种逆向工程工具[持续更新]
  10. 19-离线词典生成原理、图像描述子用BoW转化为BoW向量和FeatureVe
  11. 用python分析《三国演义》中的社交网络
  12. 亚马逊发布“不可变”量子账本数据库产品
  13. 小米手机超越苹果,成欧洲第二;马斯克特斯拉内部邮件:痛恨开会,少讲黑话;Spring 6.0 发布|极客头条
  14. 【MySQL】insert into 和select 搭配使用进行表间复制
  15. PS 反选 剪切
  16. 从京东双11战报中,找到未来值得国产品牌看好的发展机遇
  17. 【汇正财经】什么是股票交割方式?股票交割方式有哪些?
  18. java两个frame之间_java – JFrame中的两个JPanel,另一个是JP
  19. python计算机体系三层结构_python学习笔记-计算机结构、操作系统
  20. 齿轮系统动力学模型matlab程序代码

热门文章

  1. 实现一个Android锁屏App的难点总结
  2. 拍照,选择照片并且剪裁
  3. 各类重积分 | 二重积分、三重积分、线面积分 —— 大总结
  4. python第三方模块之pyquery
  5. 洛谷P3456 [POI2007]GRZ-Ridges and Valleys
  6. Android 应用多开/分身检测
  7. 未来智能酒店里 智能管家将24小时待命
  8. Agora Talk 回顾 | 深入聊聊不一样的 Flutter
  9. SC2Rank 星际2天梯排行榜 SpringMVC + Spring + Mybatis + Mysql + Maven java web项目
  10. 【题解】P3939数颜色