(精)题解 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. ...
随机推荐
- .NET平台系列15 .NET5的吊炸天性能改进
系列目录 [已更新最新开发文章,点击查看详细] .NET5的性能改进测试功能 Benchmark.NET现在是衡量.NET代码性能的规范工具,可轻松分析代码段的吞吐量和分配. .NET5的性能 ...
- AtCoder Regular Contest 121 D - 1 or 2
题目链接:点我点我 Problem Statement Snuke has a blackboard and NN candies. The tastiness of the ii-th candy ...
- 使用Git下载指定分支命令为
使用Git下载指定分支命令为: git clone -b 分支名 仓库地址 例如: git clone -b dev https://github.com/xxx.git 将下载分支名为2D- ...
- switch分支语句
语句句式 Calendar c = Calendar.getInstance(); //获得一周的某天 int i = c.get(Calendar.DAY_OF_WEEK); switch (i) ...
- 狂神说redis笔记(四)
十二.Redis主从复制 概念 主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器.前者称为主节点(Master/Leader),后者称为从节点(Slave/Follower), ...
- python 日期与字符串之间的转换
1.str转换为datetime >>> from datetime import datetime >>> cday = datetime.strptime('2 ...
- python取整函数 向上取整 向下取整 四舍五入
向上取整 >>> import math >>> math.ceil(3.5) 4 >>> math.ceil(3.4) 4 >>&g ...
- NX二次开发-向量乘矩阵的几何意义
函数:UF_MTX3_vec_multiply_t() 或者UF_MTX3_vec_multiply().推荐使用UF_MTX3_vec_multiply_t() 函数说明:将向量按照矩阵进行变换:绝 ...
- nacos 实战(史上最全)
文章很长,而且持续更新,建议收藏起来,慢慢读! 高并发 发烧友社群:疯狂创客圈(总入口) 奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : 极致经典 + 社群大片好评 < Java 高并发 三 ...
- 关于kubernetes的十七个实验(二)
写在开头 时隔好几天,结束了毕业设计中期答辩,更新第二节. 实验二与Kubeadm Kubeadm解决了以下问题:处理TLS加密配置,部署核心Kubernetes组件并确保其他节点可以轻松加入集群. ...