Luogu2860 [USACO06JAN]冗余路径Redundant Paths
Luogu2860 [USACO06JAN]冗余路径Redundant Paths
给定一个连通无向图,求至少加多少条边才能使得原图变为边双连通分量
\(1\leq n\leq5000,\ n-1\leq m\leq10^4\)
tarjan
边双无疑不用考虑,于是就可以边双缩点成一棵树
令现在要连的边为 \((u,\ v)\) ,当前树上 \(bl_u\) 到 \(bl_v\) 的链将会变为一个新的点双,可以将他们看为一个新的点
可以贪心地连边使得每次连边后,不复存在的点尽量多,当只剩一个点时,原图就变成了一个双连通分量
如果 \(u\) 为非叶节点,显然不如将 \(u\) 子树中的一点 \(u'\) 与 \(v\) 连接,于是 \(u,\ v\) 均为叶节点
若 \(lca(u,\ v)\) 为 \(root\) ,将会消去两个叶节点,否则只会消去一个叶节点,因此每次选择 \(lca(u,\ v)\) 为 \(root\) 的两个点,答案即为 \(叶节点的个数\lfloor\frac{\verb|叶节点的个数|+1}{2}\rfloor\)
时间复杂度 \(O(n+m)\)
代码
#include <bits/stdc++.h>
using namespace std;
#define nc getchar()
const int maxn = 5010;
int n, m, tot, h[maxn], bl[maxn], dfn[maxn], low[maxn], deg[maxn]; bool vis[maxn], cut[maxn << 1];
struct edges {
int nxt, to;
edges(int x = 0, int y = 0) : nxt(x), to(y) {}
} e[maxn << 1];
inline int read() {
int x = 0; char c = nc;
while (c < 48) c = nc;
while (c > 47) x = x * 10 + c - 48, c = nc;
return x;
}
void addline(int u, int v) {
static int cnt = 1;
e[++cnt] = edges(h[u], v), h[u] = cnt;
}
void tarjan(int u, int f) {
static int now;
dfn[u] = low[u] = ++now;
for (int i = h[u]; i; i = e[i].nxt) {
int v = e[i].to;
if (!dfn[v]) {
tarjan(v, u);
low[u] = min(low[u], low[v]);
if (dfn[u] < low[v]) cut[i] = cut[i ^ 1] = 1;
} else if (v != f) {
low[u] = min(low[u], dfn[v]);
}
}
}
void dfs(int u) {
vis[u] = 1, bl[u] = tot;
for (int i = h[u]; i; i = e[i].nxt) {
int v = e[i].to;
if (!cut[i] && !vis[v]) dfs(v);
}
}
int main() {
n = read(), m = read();
for (int i = 1; i <= m; i++) {
int u = read(), v = read();
addline(u, v), addline(v, u);
}
tarjan(1, 0);
for (int i = 1; i <= n; i++) {
if (!vis[i]) tot++, dfs(i);
}
for (int u = 1; u <= n; u++) {
for (int i = h[u]; i; i = e[i].nxt) {
int v = e[i].to;
if (bl[u] != bl[v]) deg[bl[v]]++;
}
}
int ans = 0;
for (int i = 1; i <= tot; i++) {
ans += deg[i] == 1;
}
printf("%d", (ans + 1) >> 1);
return 0;
}
Luogu2860 [USACO06JAN]冗余路径Redundant Paths的更多相关文章
- 洛谷 P2860 [USACO06JAN]冗余路径Redundant Paths 解题报告
P2860 [USACO06JAN]冗余路径Redundant Paths 题目描述 为了从F(1≤F≤5000)个草场中的一个走到另一个,贝茜和她的同伴们有时不得不路过一些她们讨厌的可怕的树.奶牛们 ...
- 缩点【洛谷P2860】 [USACO06JAN]冗余路径Redundant Paths
P2860 [USACO06JAN]冗余路径Redundant Paths 为了从F(1≤F≤5000)个草场中的一个走到另一个,贝茜和她的同伴们有时不得不路过一些她们讨厌的可怕的树.奶牛们已经厌倦了 ...
- 洛谷P2860 [USACO06JAN]冗余路径Redundant Paths(tarjan求边双联通分量)
题目描述 In order to get from one of the F (1 <= F <= 5,000) grazing fields (which are numbered 1. ...
- luogu P2860 [USACO06JAN]冗余路径Redundant Paths
题目描述 In order to get from one of the F (1 <= F <= 5,000) grazing fields (which are numbered 1- ...
- 洛谷P2860 [USACO06JAN]冗余路径Redundant Paths
题目描述 In order to get from one of the F (1 <= F <= 5,000) grazing fields (which are numbered 1. ...
- [USACO06JAN] 冗余路径 Redundant Paths
题目描述 In order to get from one of the F (1 <= F <= 5,000) grazing fields (which are numbered 1. ...
- luogu P2860 [USACO06JAN]冗余路径Redundant Paths |Tarjan
题目描述 In order to get from one of the F (1 <= F <= 5,000) grazing fields (which are numbered 1. ...
- 【luogu P2860 [USACO06JAN]冗余路径Redundant Paths】 题解
题目链接:https://www.luogu.org/problemnew/show/P2860 考虑在无向图上缩点. 运用到边双.桥的知识. 缩点后统计度为1的点. 度为1是有一条路径,度为2是有两 ...
- (精)题解 guP2860 [USACO06JAN]冗余路径Redundant Paths
(写题解不容易,来我的博客玩玩咯qwq~) 该题考察的知识点是边双连通分量 边双连通分量即一个无向图中,去掉一条边后仍互相连通的极大子图.(单独的一个点也可能是一个边双连通分量) 换言之,一个边双连通 ...
随机推荐
- vuejs通过filterBy,orderBy实现搜索筛选,降序排序数据实例
直接贴代码了: 先上输入前的样子: <style> #example{margin:100px auto;width:600px;} .show{margin:10px;} #search ...
- html 获取数据并发送给后端方式
一.方式一 使用ajax提交 function detailed() { var date = $("#asset_ip").text() $.ajax({ url: " ...
- 切换横竖屏的时候Activity的生命周期变化情况
关于这个,有个博客说得比较清楚:http://blog.csdn.net/wulianghuan/article/details/8603982,直接给出链接,哈哈哈.
- 在windows下如何快速搭建web.py开发框架
在windows下如何快速搭建web.py开发框架 用Python进行web开发的话有很多框架供选择,比如最出名的Django,tornado等,除了这些框架之外,有一个轻量级的框架使用起来也是非常方 ...
- SparkSQL【1.x版本】字段敏感不敏感问题
一.特征 1.SqlContext默认大小写不敏感,如果DataFrame中有字段相同,大小写不同,在使用字段的时候不会引起歧义. 2.HiveContext提供更多的Hive预置函数,可以更高效的进 ...
- java传输文件的简单方法
假设现在已经打包了一个文件(1233444333),要将这个文件传输给另一方: package file; import java.io.*; public class F_PasswordUnPas ...
- SQL Server -- 回忆笔记(二):增删改查,修改表结构,约束,关键字使用,函数,多表联合查询
SQL Server知识点回忆篇(二):增删改查,修改表结构,约束,关键字使用,函数,多表联合查询 1. insert 如果sql server设置的排序规则不是简体中文,必须在简体中文字符串前加N, ...
- Angular的MVC理解--节自Adam Free的Pro angularv2
1. 定义 Angular的核心是采用MVC模式,即Model-View-Controller,也即MVW,Model-View-Whatever. 如下图所示,借助于ASP.NET的MVC模式来描述 ...
- c/c++ 标准容器 vector的内存空间是如何自动增长的
c/c++ 标准容器 vector的内存空间是如何自动增长的 vector,string,deque的内存存储机制:在一个连续的内存空间存储,所以才支持下标操作. vector的课题:由于容器的大小是 ...
- SMB协议原理抓包分析
SMB协议原理抓包分析 目录: 1.SMB概述 2.SMB原理 3.SMB配置 一.SMB概述 SMB(全称是Server Message Block)是一个协议名,可用于在计算机间共享文件.打印机. ...