洛谷传送门
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相关推荐

  1. 无向图强联通分量-洛谷 P2860 [USACO06JAN]冗余路径Redundant Paths

    https://www.luogu.org/problem/show?pid=2860 这个就是无向图的强联通: 有向图的两点再一个分量里,是x可以到y,y也可到x: 但无向图本来就是双向的,所以我们 ...

  2. P2860 [USACO06JAN]冗余路径Redundant Paths

    实际上是一道tarjan缩点的题,tarjan求点双联通分量,主要思路就是缩完点之后,找新图中的叶子节点的个数,然后带入公式就行了.详情见lba的博客. 题干: ...略. 代码: #include& ...

  3. Luogu P1198 BZOJ 1012 最大数 (线段树)

    Luogu P1198 BZOJ 1012 最大数 (线段树) 手动博客搬家: 本文发表于20170821 14:32:05, 原地址https://blog.csdn.net/suncongbo/a ...

  4. POJ3177 Redundant Paths

    POJ3177 Redundant Paths 文章目录 Description 题意: 题解: 代码: Time Limit: 1000MS Memory Limit: 65536K Total S ...

  5. [POJ3177]Redundant Paths(双联通)

    在看了春晚小彩旗的E技能(旋转)后就一直在lol--额抽点时间撸一题吧-- Redundant Paths Time Limit: 1000MS   Memory Limit: 65536K Tota ...

  6. Quartz-2D绘图之路径(Paths)详解

    在上篇文章中,我们简单的理解了绘图上下文,今天我们来认识一下Quartz-2D中另一个重要的概念,路径(Paths). 一.理解路径 路径定义了一个或多个形状,或是子路径.一个子路径可由直线,曲线,或 ...

  7. POJ 3177 Redundant Paths POJ 3352 Road Construction(双连接)

    POJ 3177 Redundant Paths POJ 3352 Road Construction 题目链接 题意:两题一样的.一份代码能交.给定一个连通无向图,问加几条边能使得图变成一个双连通图 ...

  8. 数字IC设计学习笔记_静态时序分析STA_伪路径False Paths

    数字IC设计学习笔记 半周期路径Half Cycle Path 1. 伪路径False Paths 2. 如何处理False Paths 1. 伪路径False Paths 在设计中,有些路径是不可能 ...

  9. bzoj 1718: [Usaco2006 Jan] Redundant Paths 分离的路径

    题意 给你一个无向图 问你最少添加多少条边可以使得他变成边双图 题解 直接双连通缩点 得到一颗树 然后答案是叶子节点/2向上取整 取法是每一次找两个LCA深度最小的叶子,两个连边就可以了 然后不知道为 ...

  10. [Luogu P3642] [BZOJ 4585] [APIO2016]烟火表演

    洛谷传送门 BZOJ传送门 题目描述 烟花表演是最引人注目的节日活动之一.在表演中,所有的烟花必须同时爆炸.为了确保安全,烟花被安置在远离开关的位置上,通过一些导火索与开关相连.导火索的连接方式形成一 ...

最新文章

  1. 存储库访问被拒绝。通过部署密钥进行访问是只读的
  2. Vue_(组件通讯)非父子关系组件通信
  3. 【AC Saber】高精度
  4. 接口管理平台DOClever5.2.0 发布,大幅增强自动化测试,支持可视化UI
  5. 51NOD 1006 最长公共子序列 Lcs 动态规划 DP 模板题 板子
  6. python的基本语术_一起学python-彻底掌握专业术语“变量”的概念
  7. Python入门(03) -- 字典
  8. OpenStack securityGroup rule Set
  9. 为什么用jdbc插入数据为空_为什么气象数据推荐用 ModelWhale 处理
  10. storm-基本概念
  11. python-excel 批量输出文件名字与打开excel文件
  12. 关于 MRC 开发中的一些细节
  13. 基于ADS仿真的465khz检波电路
  14. 我珍藏很久的网盘资源搜索网站和下载神器
  15. PD3.0协议开发经验
  16. 软件测试零基础如何快速入门 ?这里有全网最详细的学习资料
  17. 【二分图匹配】【CSTC2000】丘比特的烦恼
  18. SKU组件助您将PowerBI完美嵌入第三方应用系统
  19. vue利用【​v-viewer插件】实现单张图片以及多张图片的(触屏缩放和拖动)
  20. 淘宝小程序体验优化:数据分析和优化实践

热门文章

  1. 英语每日听写练习 Day 4
  2. CountDownLatch 以及 如何使用枚举
  3. Error (10170): Verilog HDL syntax error at uart_rx.v(29) near text “<=“; expecting “.“, or “(“,
  4. 机器学习数据集半自动标注制作流程
  5. 百度在线笔试题-裁减网格纸
  6. 不同浏览器中使用nbsp的差异
  7. PTA—包装机(队列)
  8. 山东春季高考计算机网络技术重点,山东省春季高考网络技术知识点大全.docx
  9. 张雪峰谈计算机科学与技术院校,张雪峰讲过的,985高校合并史,实力大增专业更具特色!...
  10. 互联网周刊:全程电子商务:一朵能下雨的中国云