将一个无向图变成一个双联通图所需添加的最小边数

双联通图:就是一个图中任意两点之间都有两条不重合的路径相连。

桥:指的是强联通分量之间的边。

将一个无向图变成一个双联通图所需的最小边为:

首先将该图缩点,缩完点之后的图就是一个树,设该树的叶子节点为x;

所需边数:(x + 1)/ 2;

cpp 复制代码
int dfn[N], low[N], timestamp;
int stk[N], id[N], all[N];
bool in_stk[N];
int h[N], e[N], ne[N], idx;
int n, m, top, scc_cnt;
int du[N];
bool is_bridge[N];
inline void add(int a, int b)
{
    e[idx] = b, ne[idx] = h[a], h[a] = idx ++;
}
void tarjan(int u, int from)
{
    // 记录序号以及初始化可以到达的最小标号点
    dfn[u] = low[u] = ++ timestamp;
    stk[++ top] = u;
    // 便利当前节点的所有节点
    for(int i = h[u]; ~i; i = ne[i])
    {
        int j = e[i];
        if(!dfn[j]) // 该点未遍历
        {
            tarjan(j, i); // 便利子节点
            low[u] = min(low[u], low[j]); // 更新当前节点可以到达的最小序号点
            if(dfn[u] < low[j]) // 表明是一个桥 
				is_bridge[i] = is_bridge[i ^ 1] = 1; 
        }
        else if(i != (from ^ 1))
            low[u] = min(low[u], low[j]);
    }
    if(dfn[u] == low[u])
    {
        int y;
        ++ scc_cnt;
        do
        {
            y = stk[top --];
            id[y] = scc_cnt;
        }while(y != u);
    }
}
inline void sovle()
{
    cin >> n >> m;
    memset(h, -1, sizeof h);
    while(m --){
        int a, b;
        cin >> a >> b;
        add(a, b);
        add(b, a);
    }
    tarjan(1, -1);
    for(int i = 0; i < idx; i ++)
    	if(is_bridge[i]) // 将该点的出度加一
    		du[id[e[i]]] ++;
	int s = 0;
	for(int i = 1; i <= scc_cnt; i ++)
		if(du[i] == 1) // 若是该点的出度为1,说明是一个叶子节点
			s ++;
    cout << (s + 1) / 2 << endl; 
}
相关推荐
wabs6667 小时前
关于图论【卡码网117.软件构建的思考】
数据结构·算法·软件构建·图论·卡码网
mifengxing8 小时前
LeetCode 41.缺失的第一个正数|Hard题O(n)+O(1)最优解法深度解析
java·算法·leetcode·排序算法
Tongzhi20268 小时前
从部署到运维:通芝科技无感考勤一体机的全流程效率解析
运维·数据结构·科技·算法·贪心算法
Wang's Blog9 小时前
AI Agent白手起家30: 动态示例选择器之根据长度选择 Few Shot 示例
算法
oyguyteggytrrwwwrt10 小时前
自制交叉线路识别算法
算法
手写码匠10 小时前
华为云Flexus+DeepSeek征文|Dify 多智能体协同编排实战:R1 规划 + V3 执行,构建企业 Agent 团队
人工智能·深度学习·算法·aigc
晓天衡宇•评测社区11 小时前
FSR-Bench 前沿科学推理榜单发布:GPT-5.5 居首,“会推理”未必“能答对”
算法
程序喵大人13 小时前
【C++进阶】STL算法与函数对象 - 02 sort为什么需要随机访问迭代器
开发语言·c++·算法
hanlin0313 小时前
动态规划专练:力扣第121、122题
笔记·算法·leetcode
To_OC13 小时前
LC 74 搜索二维矩阵:换皮的二分查找,我居然一开始没看出来
javascript·算法·leetcode