(精)题解 guP2860 [USACO06JAN]冗余路径Redundant Paths
(写题解不容易,来我的博客玩玩咯qwq~)
该题考察的知识点是边双连通分量
边双连通分量即一个无向图中,去掉一条边后仍互相连通的极大子图。(单独的一个点也可能是一个边双连通分量)
换言之,一个边双连通分量中不包含桥。
例如下图(样例)中的边双连通分量有(1),(2,3,5,6),(4),(7)
不难发现,在一个边双连通分量中,任意两点都存在至少两条互相分离的路径;(如1->2与1->3->2)
如若不在一个边双连通分量中,则可能经过桥(甚至不联通)如:2->4。
由于桥是必须通过的,所以不存在两条互相分离的路径(或没有路径)。我们要做的,就是连边将整张图变成一张边双连通图。
(正文好像才开始)
首先是找出所有边双连通分量。不难发现,边双连通分量不包含桥,因此我们只需将桥无视掉,每一个连通的子图就是一个边双连通分量。(桥的公式大家都知道吧)代码如下:
void tarjan(int u,int edge)
{
dfn[u]=low[u]=++num;
for(int i=fst[u];i!=0;i=nex[i])
{
int v=to[i];
if(!dfn[v])
{
tarjan(v,i);
low[u]=min(low[u],low[v]);
if(dfn[u]<low[v]) //桥的公式qwq
{
bridg[i]=bridg[i^1]=1;
}
}
else if(i!=(edge^1))
low[u]=min(low[u],dfn[v]);
}
}
因为在一个边双连通分量中,任意两点都存在至少两条互相分离的路径,所以我们可以将其缩为一个点。缩完点之后,我们可以把它转换成一棵树。
我们会发现,去掉一条边后可能会与原树不连通的,是只连有一条边的边,即叶结点(设其数量为leaf)。为令原图 边双连通(我不知道这么说对不对),我们把两个叶结点为一组用新边将其连接起来。这么看,答案似乎是leaf/2了。
且慢!!让我们看看上图。上图leaf=3,而leaf/2=1。事实上,我们需要2条边。所以最终公式为(leaf+1)/2。(终于完了qwq)
最后捋一捋思路:
找边双连通分量
缩点
建树,找leaf
ans=(leaf+1)/2
完结撒花qwqwqwqwqwq
code:
//Author:夏目贵志
#include<bits/stdc++.h>
using namespace std;
int qwwq,fst[10100],nex[10100],to[10100],a,b,cnt,num,cutn,bridg[10100],br,u[10100];
int dfn[10100],low[10100],ans,f[10100],root,pl,n,m,size,t,dcc,c[10100],du[10100];
void add(int a,int b)
{
nex[++t]=fst[a];
u[t]=a;
to[t]=b;
fst[a]=t;
return ;
}
void tarjan(int u,int edge)
{
dfn[u]=low[u]=++num;
for(int i=fst[u];i!=0;i=nex[i])
{
int v=to[i];
if(!dfn[v])
{
tarjan(v,i);
low[u]=min(low[u],low[v]);
if(dfn[u]<low[v])
{
bridg[i]=bridg[i^1]=1;
}
}
else if(i!=(edge^1))
low[u]=min(low[u],dfn[v]);
}
}
void dfs(int u)
{
c[u]=dcc;
for(int i=fst[u];i!=0;i=nex[i])
{
int v=to[i];
if(c[v]!=0||bridg[i]==1)
continue;
dfs(v);
}
}
int main()
{
scanf("%d%d",&n,&m);
t=1;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
add(a,b);add(b,a);
}
tarjan(1,0);
for(int i=1;i<=n;i++)
{
if(!c[i])
{
dcc++;
dfs(i);
}
}
for(int i=1;i<=m;i++)
{
if(c[u[i*2]]!=c[to[i*2]])
{
du[c[u[i*2]]]++;
du[c[to[i*2]]]++;
}
}
for(int i=1;i<=dcc;i++)
{
if(du[i]==1)
br++;
}
cout<<(br+1)/2;
return 0;
}
(精)题解 guP2860 [USACO06JAN]冗余路径Redundant Paths的更多相关文章
- Luogu2860 [USACO06JAN]冗余路径Redundant Paths
Luogu2860 [USACO06JAN]冗余路径Redundant Paths 给定一个连通无向图,求至少加多少条边才能使得原图变为边双连通分量 \(1\leq n\leq5000,\ n-1\l ...
- 洛谷 P2860 [USACO06JAN]冗余路径Redundant Paths 解题报告
P2860 [USACO06JAN]冗余路径Redundant Paths 题目描述 为了从F(1≤F≤5000)个草场中的一个走到另一个,贝茜和她的同伴们有时不得不路过一些她们讨厌的可怕的树.奶牛们 ...
- 缩点【洛谷P2860】 [USACO06JAN]冗余路径Redundant Paths
P2860 [USACO06JAN]冗余路径Redundant Paths 为了从F(1≤F≤5000)个草场中的一个走到另一个,贝茜和她的同伴们有时不得不路过一些她们讨厌的可怕的树.奶牛们已经厌倦了 ...
- 【luogu P2860 [USACO06JAN]冗余路径Redundant Paths】 题解
题目链接:https://www.luogu.org/problemnew/show/P2860 考虑在无向图上缩点. 运用到边双.桥的知识. 缩点后统计度为1的点. 度为1是有一条路径,度为2是有两 ...
- 洛谷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. ...
随机推荐
- openresty - nginx - 配置
local function local_print(str) local dbg = io.open("conf/lua/logs/output.txt", "a+&q ...
- Python爬取微信小程序(Charles)
Python爬取微信小程序(Charles) 本文链接:https://blog.csdn.net/HeyShHeyou/article/details/90045204 一.前言 最近需要获取微信小 ...
- win10下abd环境配置
一.下载安装 Android SDK 下载地址: http://tools.android-studio.org/index.php/sdk 下载完成后进行解压至D盘根目录下,也可以自定义英文路径下 ...
- 总结springboot开启mybatis驼峰命名自动映射的三种方式
方式一:通过springboot的配置文件application.yml mybatis: configuration: map-underscore-to-camel-case: true 此方式是 ...
- 「题解」NWRRC2017 Grand Test
本文将同步发布于: 洛谷博客: csdn: 博客园: 简书. 题目 题目链接:洛谷 P7025.gym101612G. 题意概述 给你一张有 \(n\) 个点 \(m\) 条边的无向图,无重边无自环, ...
- Spring Cloud底层原理解析
概述 毫无疑问,Spring Cloud是目前微服务架构领域的翘楚,无数的书籍博客都在讲解这个技术.不过大多数讲解还停留在对Spring Cloud功能使用的层面,其底层的很多原理,很多人可能并不知晓 ...
- 复习Spring第四课---Spring对国际化的支持
其实国际化这东西很少使用,之前也就是粗略的学了下,趁今天有空,拿出来稍微写写.以前学android开发的时候,类似于多语言的版本.差别就是一个是手机打开,一个是浏览器打开,本质是一样的. 在Sprin ...
- .NetCore使用Docker安装ElasticSearch、Kibana 记录日志
前言 最近园子里看到一篇<.Net Core with 微服务 - Elastic APM> 的文章(主要用于对接口的调用链.性能进行监控),非常实用,这里讲解.NetCore将日志写入E ...
- ceph-csi源码分析(2)-组件启动参数分析
更多ceph-csi其他源码分析,请查看下面这篇博文:kubernetes ceph-csi分析目录导航 ceph-csi源码分析(2)-组件启动参数分析 ceph-csi组件的源码分析分为五部分: ...
- Excel选择区域一次性替换小于200的数值
1.ctrl+F,点击"选项",在出来的扩展框选择"格式"后小三角,选择"从单元格选择格式": 2.选择要进行替换小于200的区域: . 3 ...