/*
对于边双连通分支,求法更为简单。只需在求出所有的桥以后,把桥边删除,\
原图变成了多个连通块,则每个连通块就是一个边双连通分支。桥不属于任何
一个边双连通分支,其余的边和每个顶点都属于且只属于一个边双连通分支。
一个有桥的连通图,如何把它通过加边变成边双连通图?方法为首先求出所有的桥,
然后删除这些桥边,剩下的每个连通块都是一个双连通子图。把每个双连通子图收缩为一个顶点,
再把桥边加回来,最后的这个图一定是一棵树,边连通度为1。
统计出树中度为1的节点的个数,即为叶节点的个数,记为leaf。则至少在树上添加(leaf+1)/2条边,
就能使树达到边二连通,所以至少添加的边数就是(leaf+1)/2。具体方法为,首先把两个最近公共祖先最远
的两个叶节点之间连接一条边,这样可以把这两个点到祖先的路径上所有点收缩到一起,
因为一个形成的环一定是双连通的。然后再找两个最近公共祖先最远的两个叶节点,这样一对一对找完,
恰好是(leaf+1)/2次,把所有点收缩到了一起。
*/
/*
(1) n 为顶点数, 标号从 1 开始
(2) c 为原图的邻接表, g 为 E_BCC 图的邻接表
(3) num[u] 表示原图中的点 u 属于新图中的第 num[u] 个 E_BCC
(4) edge[] 存储所有的桥
(5) 注意 pool[M] 要开得足够大以容得下新旧两个图中所有的边
(6) E_BCC 图中去掉了自环 ( 显然不存在多重边 )
*/
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 11115;
const int M = 2000005;
struct List {
int v, id;
List *next;
} pool[M], *c[N], *g[N], *pp;
//c 为原图的邻接表, g 为 E_BCC 图的邻接表
//注意 pool[M] 要开得足够大以容得下新旧两个图中所有的边
inline void add_edge(int u, int v, int id, List *c[])
{
pp->v = v;
pp->id = id;
pp->next = c[u];
c[u] = pp ++;
}
struct Edge {
int u, v;
} edge[M];
//edge[] 存储所有的桥,u,v为桥的两个顶点
int n, m, label, tot, top;
int low[N], dfn[N], num[N], stack[N];
bool eflag[M];
//label时间戳,tot连通块数
//dfn用来保存时间戳(次序)编号,low保存顶点i或i的子树最早的次序编号
//num[u] 表示原图中的点 u 属于新图中的第 num[u] 个 E_BCC
void E_BCC_VISIT(int u)
{
low[u] = dfn[u] = label ++;
stack[++ top] = u;
for(List *p = c[u]; p; p = p->next) {
int v = p->v;
if(eflag[p->id]) continue;
eflag[p->id] = true;
//if(dfn[v]) { low[u] <?= dfn[v]; continue; }
if(dfn[v]){
if(low[u] > dfn[v]) low[u] = dfn[v];
continue;
}
E_BCC_VISIT(v);
//low[u] <?= low[v];
if(low[u] > low[v]) low[u]=low[v];
if(low[v] > dfn[u]) {
edge[m].u = u;//第m条桥的两个顶点u,v
edge[m ++].v = v;
++ tot;
do {
num[stack[top]] = tot;
} while( stack[top --] != v );
}
}
}
void E_BCC()
{
int i;
tot = 0;
m = 0;/////
for(i = 1; i <= n; ++ i) dfn[i] = 0, num[i] = -1;
for(i = 0; i < m; ++ i) eflag[i] = false;
for(i = 1; i <= n; ++ i)
if(dfn[i] == 0) {
label = 1;
top = -1;
E_BCC_VISIT(i);
++ tot;
while( top >= 0 ) {
num[stack[top]] = tot;
-- top;
}
}
for(i = 1; i <= tot; ++ i) g[i] = NULL;
//for(i = 1; i <= n; ++ i) {//缩点,这题用不着
// int u = num[i];//u为一个双连通分量
//for(List *p = c[i]; p; p = p->next) {
// int v = num[p->v];//v是另一个双连通分量
//if(u != v) add_edge(u, v, 0, g);//在两个分量间建一条边
//}
//}
}
int main()
{
int i, j, k;
while( scanf("%d %d", &n, &m) == 2 ) {
for(i = 1; i <= n; ++ i) c[i] = NULL;
pp = pool;
for(k = 0; k < m; ++ k) {
scanf("%d %d", &i, &j);
add_edge(i, j, k, c);
add_edge(j, i, k, c);
}
E_BCC();
if(m == 0){cout<<0<<endl; continue;}
int du[N]={0};
for(int i=0;i<m;i++){//桥即为联通块的之间的边,这里处理伪缩点
//cout<<num[edge[i].u]<<' '<<num[edge[i].v]<<endl;
du[num[edge[i].u]]++;//要用num[]映射到连通块编号上计算联通块的度
du[num[edge[i].v]]++;
}
int leaf=0;//树叶
//cout<<tot<<endl<<m<<endl;
for(int i=1;i<=tot;i++) if(du[i]==1)leaf++;
cout<<(leaf+1)/2<<endl;
//for(int i=0;i<=m;i++)printf("num[%d]:%d\n",i,num[i]);
//printf("tot:%d m:%d\n",tot,m);
}
return 0;
}
相关推荐
ADS重新安装失败排查指南:从注册表清理到环境变量配置
本文详细解析了ADS重新安装失败的常见原因及解决方案,包括注册表残留清理、license路径锁定处理和环境变量配置。通过分步指南和实用技巧,帮助工程师高效解决安装问题,确保软件正常运行。
POJ 3352 Road Construction
题目大意: 给定图G,求最少加多少边可以成为双连通图。 解题思路: 1、求图G中的双连通分量。 2、每一个双联通分量缩成一个点,形成一棵树。 3、计算出叶子节点的个数,需要加的边的数量就是(叶子节点个数+1)/2。 解题中要注意的: 用Tarjan算法求双连通分量的时候,并不是low数组中值不同的就不再同一个双联通分量。 很多大牛的博客都只借助low数组中的
国密系列算法简介
众所周知,为了保障商用密码的安全性,国家商用密码管理办公室制定了一系列密码标准,包括SM1(SCB2)、SM2、SM3、SM4、SM7、SM9、祖冲之密码算法(ZUC)那等等。其中SM1、SM4、SM7、祖冲之密码(ZUC)是对称算法;SM2、SM9是非对称算法;SM3是哈希算法。目前,这些算法已广泛应用于各个领域中,期待有一天会有采用国密算法的区块链应用出现。其中SM1、SM7算法不公开,调用该...
poj3352 Road Construction(边双连通 + 缩点)
题意:若使得任意两个小岛之间都有至少两条路径(无重边)可以相互到达,那么需要至少添加几条边。 思路:边双连通是指在一个无向图中任意两个点之间至少存在两条路径,并且路径中的边不同。所以这个题目,我们可以求边双连通分量 ,然后缩点,这时整个图就变成了一棵树,问题就转化为至少在一棵树中添加几条边使得这颗树变成一个边双连通图,在确保整个原图连通的情况下,边双连通缩点后就只有一棵树,所以添加的边数为 ( ...
测试工程师玩转DeepSeek之Prompt
掌握这些提示词技巧,测试工程师可提升与DeepSeek的协作效率至少3倍。建议结合具体项目上下文进行二次优化,并建立团队内部的提示词知识共享库。✅ “为电商支付接口生成包含幂等性验证的测试用例,覆盖网络中断重试场景”❌ “帮我写测试用例”
基于Transformer模型实现交通流量时序预测(PyTorch版)
Transformer模型,作为一种基于自注意力机制的深度学习模型,最初在自然语言处理领域取得了突破性进展,其出色的长距离依赖关系捕捉能力使其在处理时序数据时也表现出色。将Transformer模型应用于交通流量时序预测,可以充分利用其优势,实现对交通流量更加精准、高效的预测。
Road Construction 【POJ - 3352】【Tarjan边双连通】
题目链接 题意:给一个无向连通图,至少添加几条边使得去掉图中任意一条边不改变图的连通性(即使得它变为边双连通图)。 思路:就是去求一个缩点之后求度为1的点的个数,然后用(ans + 1)/2就可以得到最后的答案了。 #include <iostream> #include <cstdio> #include <cmath> #include &l...
倾斜摄影数据转换为3DTile格式的方法:基于CesiumLab GIS
通过使用CesiumLab GIS,倾斜摄影数据可以方便地转换为3DTile格式,并在CesiumJS等3D地理信息可视化工具中进行展示和分析。一旦成功导入3DTile数据,就可以在CesiumLab GIS中利用其强大的可视化和分析功能进行进一步的处理。转换完成后,可以将生成的3DTile数据导入到CesiumLab GIS中进行可视化和分析。启动CesiumLab GIS应用程序,并按照界面上的指导导入转换后的3DTile数据。脚本将开始执行,并将倾斜摄影数据转换为3DTile格式。
poj3352 Road Construction 缩点
有时根据问题的需要,要把边双连通分量抽象为一个点,这就叫缩点。 缩点的根据也是low值;同一边双连通分量的点,low值相同,因为对于该边双连通分量dfs树上的根节点u和其子孙节点v,它们之间除了有一条dfs树边组成的路径之外,肯定还有一条包含回边的路径,所以每个点v都能通过一条非dfs树上的路径到达u点,即所有的low[v]=u; 经过缩点后的无向图是一棵树(树的每一条边都是割边)
Qt 国产嵌入式操作系统实现文字转语音功能(ekho库)
Qt 国产嵌入式操作系统实现文字转语音功能(TTS)_tts驱动 转文字-优快云博客在继上篇文章之后,甲方粑粑不满意使用eSpeak发出的声音太难听了,这就不得不找个替代品,声音稍微好听了一些。使用ekho开源库。Ekho(余音)是一个免费、开源的中文语音合成软件。它目前支持粤语、普通话(国语)、诏安客语、藏语、雅言(中国古代通用语)和韩语(试验中),英文则通过Festival间接实现。Ekho支持Linux、Windows和Android平台。
西门子S7-1200PLC控制步进电机的组态编程和具体步骤
西门子S7-1200PLC控制步进电机的组态编程和具体步骤 硬件准备: 1) 一个S7-1214C DC/DC/DC,订货号:6ES7 214-1AG40-0XB0 2) 一个86系的步进电机+相应的驱动器 3) 一个20A的西门子24V电源(步进驱动器及plc电源) 4) Portal V15版本 组态及编程: 1) 创建一个验证项目,添加cpu( S7-1214C),双击“工艺对象”,选择“运动控制”的TO_PositioningAxis V6.0版本,如下图所示: 2) “确定”后,系统自动生成名
【POJ 3352】 Road Construction(边联通分量入门)
【POJ 3352】 Road Construction(边联通分量入门) Road Construction Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10418 Accepted: 5164 Description It's al
InVEST模型 | HAbitat quality模块计算生境质量
本文详细介绍使用InVEST模型中HAbitat quality模块计算生境质量,包含各个参数的含义、所需数据、数据处理以及需要各个参数注意的地方等过程。
【POJ No. 3352】道路建设 Road Construction
【POJ No. 3352】道路建设 Road Construction
SIMATIC S7-1200, S7-1500 PID 控制[手册]
SIMATIC S7-1200, S7-1500 PID 控制[手册]
迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)
迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)
poj 3352 Road Construction (双连通)
It's almost summer time, and that means that it's almost summer construction time! This year, the good people who are in charge of the roads on the tropical island paradise of Remote Island would like
Data-Structures-and-Algorithm-Analysis-in-Java.pdf
作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...
POJ3352Road Construction(边的双连通+强连通缩点)
点击打开链接 Road Construction Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 8168 Accepted: 4106 Description It's almost summer time, and that means that it's almost summer con...
VB摄像头监控
该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制
poj3352——Road Construction——————【加边为边-双连通图】
/** 解题思路:找到图的边-双连通分量,将分量缩成点后,求出缩点后的dfs树的各个结点的度,求出叶子结点(度为1)个数,根据定理计算需要加的最少边即可。 */ 题目大意: 某度假公司要在可互相到达的各景点(连通图)的一些路上做些装饰,正在装饰的道路暂时不可以通行,现需要架设临时通道,使各个景点仍可相互到达,问最少需要架多少条通道。 /*
Road Construction(POJ 3352)---加边双连通
题目链接 题目描述 It’s almost summer time, and that means that it’s almost summer construction time! This year, the good people who are in charge of the roads on the tropical island paradise of Remote Isla...
POJ 3352 Road Construction 边双连通分量 缩点
题意:给一个无向图,求在图中最少加多少条边使得图变为边双连通图 边双连通图:若一个无向图去掉任意一条边都不会改变这个图的连通性,即不存在桥,则称该图为边双连通图 思路:对每个点求一次tarjan,low值相同的点在同一个边双连通分量里,将这些点缩在一个点里,求出缩点之后图中每个点的度数,需要加的边数等于(度数为1的点的数量+1)/2 #include<iostream> #includ...
【题解】Road Construction POJ - 3352 ⭐⭐⭐ 【构造边双联通分支】
Road Construction POJ - 3352 It’s almost summer time, and that means that it’s almost summer construction time! This year, the good people who are in charge of the roads on the tropical island paradi...
POJ 3352 Road Construction 点双连通分支 -
题目地址:http://poj.org/problem?id=3352 题意:给你一个图,要求你加入最少的边,使得最后得到的图为一个边双连通分支。所谓的边双连通分支,即不存在桥的连通分支。 思路: 可以求出所有的桥,把桥删掉。然后把所有的连通分支求出来,显然这些连通分支就是原图中的双连通分支。把它们缩成点,然后添上刚才删去的桥,就构成了一棵树。在树上添边使得树变成一个双连通分支即
POJ 3352 Road Construction (边双连通分量 Tarjan缩点)
本题详解在前面一篇文章 Tarjan缩点的含义: low值相等的点在一个双连通分量中,把一个分量看成一个点,重构成一棵树 定理:对于一棵叶子节点数为n的树,需要加(n+1)/2 条边把它变成双连通的。因此本题缩完点之后求一下这个值就是答案。 对于有重边的边双连通分量,如果从u点有两条边到它的father,那么dfn[fa]也可以用来更新lowu。下面这个模板可以处理有重边的情况。
POJ 3352 Road Construction解题报告
题目大意很简单:给定一个双向连通的公路网,当某些公路路段检修的时候可能会由于该段公路不通,可能会使某些旅游点之间无法通行,求至少新建多少条公路,使得任意对一段公路进行检修的时候,所有的旅游景点之间仍然畅通;分析:检修某一路段导致公路网不畅通的原因必然是该段公路在图中是一桥,因此,完全畅通的方法就是,家最若干条边,使图中不存在桥。先找出所有的桥,将双连通分量进行缩点,得到一个树形图,将所有的叶子
POJ 3352--Road Construction【无向图增加最少的边成为边双连通图 && tarjan求ebc && 缩点构造缩点树】
Road Construction Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9986 Accepted: 4952 Description It's almost summer time, and that means that it's almos
poj 3352 Road Construction 双连通图
大致题意: 某个企业想把一个热带天堂岛变成旅游胜地,岛上有N个旅游景点,任意2个旅游景点之间有路径连通(注意不一定是直接连通)。而为了给游客提供更方便的服务,该企业要求道路部门在某些道路增加一些设施。 道路部门每次只会选择一条道路施工,在该条道路施工完毕前,其他道路依然可以通行。然而有道路部门正在施工的道路,在施工完毕前是禁止游客通行的。这就导致了在施工期间游客可能无法到达一些景点。 为了在
455



被折叠的 条评论
为什么被折叠?



