[Luogu P2860] [BZOJ 1718] [USACO06JAN]冗余路径Redundant Paths
洛谷传送门
BZOJ传送门
题目描述
为了从 F ( 1 ≤ F ≤ 5000 ) F(1≤F≤5000) F(1≤F≤5000)个草场中的一个走到另一个,贝茜和她的同伴们有时不得不路过一些她们讨厌的可怕的树.奶牛们已经厌倦了被迫走某一条路,所以她们想建一些新路,使每一对草场之间都会至少有两条相互分离的路径,这样她们就有多一些选择.
每对草场之间已经有至少一条路径.给出所有 R ( F − 1 ≤ R ≤ 10000 ) R(F-1≤R≤10000) R(F−1≤R≤10000)条双向路的描述,每条路连接了两个不同的草场,请计算最少的新建道路的数量, 路径由若干道路首尾相连而成.两条路径相互分离,是指两条路径没有一条重合的道路.但是,两条分离的路径上可以有一些相同的草场. 对于同一对草场之间,可能已经有两条不同的道路,你也可以在它们之间再建一条道路,作为另一条不同的道路.
注:给定的路径如有重复的算为一条!!
输入输出格式
输入格式
第一行两个正整数 n , m n,m n,m。
以下 m m m行, 每行两个正整数 a i , b i a_i,b_i ai,bi, 表示编号为 a i a_i ai和 b i b_i bi的草场之间有一条无向边。
输出格式
一行一个整数, 表示最少需要添加的路径数。
输入输出样例
输入样例#1:
7 7
1 2
2 3
3 4
2 5
4 5
5 6
5 7
输出样例#1:
2
解题分析
先缩边双, 同一个边双内肯定是满足条件的。
然后这个图就变成了一棵树。 发现问题在叶节点上面: 我们肯定需要连接两个叶节点使其可以在一个环内。
那么这个下限是多少? 实际上设叶节点个数为 k k k, 答案就是 ⌈ k 2 ⌉ \lceil \frac{k}{2}\rceil ⌈2k⌉。
这是因为我们总可以找到一个点作为根节点, 使其最大的一棵子树大小 ≤ ⌈ k 2 ⌉ \le \lceil \frac{k}{2} \rceil ≤⌈2k⌉。
然后我们就可以保证存在至少一种方案, 每次选取的两个点连成环之后会经过这个根节点, 这样再缩边双后就等于消去了两个叶节点。
代码如下:
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <map>
#include <algorithm>
#define R register
#define IN inline
#define W while
#define gc getchar()
#define ll long long
#define MX 10050
template <class T>
IN void in(T &x)
{x = 0; R char c = gc;for (; !isdigit(c); c = gc);for (; isdigit(c); c = gc)x = (x << 1) + (x << 3) + c - 48;
}
template <class T> IN T max(T a, T b) {return a > b ? a : b;}
template <class T> IN T min(T a, T b) {return a < b ? a : b;}
int n, m, tot, cnt, top, col, ecnt;
struct E {int from, to;} e[MX];
IN bool operator < (const E &x, const E &y)
{return x.from == y.from ? x.to < y.to : x.from < y.from;}
struct Edge {int to, nex;} edge[MX << 1];
int head[MX], dfn[MX], low[MX], bel[MX], sta[MX], deg[MX];
IN void add(R int from, R int to)
{edge[++cnt] = {to, head[from]}, head[from] = cnt;}
std::map <E, bool> mp;
void DFS(R int now, R int fa)
{dfn[now] = low[now] = ++tot;sta[++top] = now;for (R int i = head[now]; i; i = edge[i].nex){if (edge[i].to == fa) continue;if (!dfn[edge[i].to]){DFS(edge[i].to, now);low[now] = min(low[now], low[edge[i].to]);}else low[now] = min(low[now], dfn[edge[i].to]);}if (dfn[now] == low[now]){bel[now] = ++col;W (sta[top] ^ now) bel[sta[top--]] = col;--top;}
}
int main(void)
{in(n), in(m); int foo, bar, ans = 0;for (R int i = 1; i <= m; ++i){in(foo), in(bar);if (foo > bar) std::swap(foo, bar);if (mp[{foo, bar}]) continue;mp[{foo, bar}] = true;add(foo, bar), add(bar, foo), e[++ecnt] = {foo, bar};}for (R int i = 1; i <= n; ++i) if (!dfn[i]) DFS(i, 0);for (R int i = 1; i <= ecnt; ++i)if (bel[e[i].from] ^ bel[e[i].to]) ++deg[bel[e[i].from]], ++deg[bel[e[i].to]];for (R int i = 1; i <= col; ++i) if (deg[i] == 1) ++ans;printf("%d", ans + 1 >> 1);
}
[Luogu P2860] [BZOJ 1718] [USACO06JAN]冗余路径Redundant Paths相关推荐
- 无向图强联通分量-洛谷 P2860 [USACO06JAN]冗余路径Redundant Paths
https://www.luogu.org/problem/show?pid=2860 这个就是无向图的强联通: 有向图的两点再一个分量里,是x可以到y,y也可到x: 但无向图本来就是双向的,所以我们 ...
- P2860 [USACO06JAN]冗余路径Redundant Paths
实际上是一道tarjan缩点的题,tarjan求点双联通分量,主要思路就是缩完点之后,找新图中的叶子节点的个数,然后带入公式就行了.详情见lba的博客. 题干: ...略. 代码: #include& ...
- Luogu P1198 BZOJ 1012 最大数 (线段树)
Luogu P1198 BZOJ 1012 最大数 (线段树) 手动博客搬家: 本文发表于20170821 14:32:05, 原地址https://blog.csdn.net/suncongbo/a ...
- POJ3177 Redundant Paths
POJ3177 Redundant Paths 文章目录 Description 题意: 题解: 代码: Time Limit: 1000MS Memory Limit: 65536K Total S ...
- [POJ3177]Redundant Paths(双联通)
在看了春晚小彩旗的E技能(旋转)后就一直在lol--额抽点时间撸一题吧-- Redundant Paths Time Limit: 1000MS Memory Limit: 65536K Tota ...
- Quartz-2D绘图之路径(Paths)详解
在上篇文章中,我们简单的理解了绘图上下文,今天我们来认识一下Quartz-2D中另一个重要的概念,路径(Paths). 一.理解路径 路径定义了一个或多个形状,或是子路径.一个子路径可由直线,曲线,或 ...
- POJ 3177 Redundant Paths POJ 3352 Road Construction(双连接)
POJ 3177 Redundant Paths POJ 3352 Road Construction 题目链接 题意:两题一样的.一份代码能交.给定一个连通无向图,问加几条边能使得图变成一个双连通图 ...
- 数字IC设计学习笔记_静态时序分析STA_伪路径False Paths
数字IC设计学习笔记 半周期路径Half Cycle Path 1. 伪路径False Paths 2. 如何处理False Paths 1. 伪路径False Paths 在设计中,有些路径是不可能 ...
- bzoj 1718: [Usaco2006 Jan] Redundant Paths 分离的路径
题意 给你一个无向图 问你最少添加多少条边可以使得他变成边双图 题解 直接双连通缩点 得到一颗树 然后答案是叶子节点/2向上取整 取法是每一次找两个LCA深度最小的叶子,两个连边就可以了 然后不知道为 ...
- [Luogu P3642] [BZOJ 4585] [APIO2016]烟火表演
洛谷传送门 BZOJ传送门 题目描述 烟花表演是最引人注目的节日活动之一.在表演中,所有的烟花必须同时爆炸.为了确保安全,烟花被安置在远离开关的位置上,通过一些导火索与开关相连.导火索的连接方式形成一 ...
最新文章
- 存储库访问被拒绝。通过部署密钥进行访问是只读的
- Vue_(组件通讯)非父子关系组件通信
- 【AC Saber】高精度
- 接口管理平台DOClever5.2.0 发布,大幅增强自动化测试,支持可视化UI
- 51NOD 1006 最长公共子序列 Lcs 动态规划 DP 模板题 板子
- python的基本语术_一起学python-彻底掌握专业术语“变量”的概念
- Python入门(03) -- 字典
- OpenStack securityGroup rule Set
- 为什么用jdbc插入数据为空_为什么气象数据推荐用 ModelWhale 处理
- storm-基本概念
- python-excel 批量输出文件名字与打开excel文件
- 关于 MRC 开发中的一些细节
- 基于ADS仿真的465khz检波电路
- 我珍藏很久的网盘资源搜索网站和下载神器
- PD3.0协议开发经验
- 软件测试零基础如何快速入门 ?这里有全网最详细的学习资料
- 【二分图匹配】【CSTC2000】丘比特的烦恼
- SKU组件助您将PowerBI完美嵌入第三方应用系统
- vue利用【​v-viewer插件】实现单张图片以及多张图片的(触屏缩放和拖动)
- 淘宝小程序体验优化:数据分析和优化实践
热门文章
- 英语每日听写练习 Day 4
- CountDownLatch 以及 如何使用枚举
- Error (10170): Verilog HDL syntax error at uart_rx.v(29) near text “<=“; expecting “.“, or “(“,
- 机器学习数据集半自动标注制作流程
- 百度在线笔试题-裁减网格纸
- 不同浏览器中使用nbsp的差异
- PTA—包装机(队列)
- 山东春季高考计算机网络技术重点,山东省春季高考网络技术知识点大全.docx
- 张雪峰谈计算机科学与技术院校,张雪峰讲过的,985高校合并史,实力大增专业更具特色!...
- 互联网周刊:全程电子商务:一朵能下雨的中国云