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

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

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

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

首先将该图缩点,缩完点之后的图就是一个树,设该树的叶子节点为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; 
}
相关推荐
学高数就犯困2 小时前
性能优化:LRU缓存(清晰易懂带图解)
算法
CoovallyAIHub5 小时前
CVPR 2026 | MixerCSeg:仅2.05 GFLOPs刷新四大裂缝分割基准!解耦Mamba隐式注意力,CNN+Transformer+Mamba三
深度学习·算法·计算机视觉
CoovallyAIHub5 小时前
YOLO26-Pose 深度解读:端到端架构重新设计,姿态估计凭什么跨代领先?
深度学习·算法·计算机视觉
CoovallyAIHub6 小时前
化工厂气体泄漏怎么用AI检测?30张图3D重建气体泄漏场景——美国国家实验室NeRF新研究
深度学习·算法·计算机视觉
颜酱17 小时前
图的数据结构:从「多叉树」到存储与遍历
javascript·后端·算法
zone77391 天前
006:RAG 入门-面试官问你,RAG 为什么要切块?
后端·算法·面试
CoovallyAIHub1 天前
OpenClaw 近 2000 个 Skills,为什么没有一个好用的视觉检测工具?
深度学习·算法·计算机视觉
CoovallyAIHub1 天前
CVPR 2026 | 用一句话告诉 AI 分割什么——MedCLIPSeg 让医学图像分割不再需要海量标注
深度学习·算法·计算机视觉
CoovallyAIHub1 天前
Claude Code 突然变成了 66 个专家?这个 5.8k Star 的开源项目,让我重新理解了什么叫"会用 AI"
深度学习·算法·计算机视觉
兆子龙1 天前
前端哨兵模式(Sentinel Pattern):优雅实现无限滚动加载
前端·javascript·算法