首页 > 其他分享 >割边和边双联通分量

割边和边双联通分量

时间:2024-09-26 09:36:52浏览次数:8  
标签:联通 int 割边 back dfn low push 分量

割边(Bridge)

在图论中,割边(Bridge)是指在一个无向图中,如果删除某条边会导致图的连通分量数量增加,那么这条边就被称为割边。换句话说,割边是连接两个不同连通分量的边。

性质

  1. 连通性:删除割边会使得图的连通性降低,即原本连通的节点变得不连通。
  2. 无向图:割边的概念主要应用于无向图。
  3. 桥的检测:可以使用Tarjan算法来检测图中的割边。

Tarjan算法检测割边

Tarjan算法是一种深度优先搜索(DFS)算法,用于检测图中的割边和强连通分量。以下是Tarjan算法检测割边的基本步骤:

  1. 初始化

    • 为每个节点设置一个时间戳(dfn)和一个追溯值(low)。
    • 使用一个栈来记录访问的节点。
  2. DFS遍历

    • 从任意一个节点开始进行DFS遍历。
    • 对于每个节点,记录其访问时间戳(dfn)和追溯值(low)。
    • 对于每个节点的邻接节点,如果邻接节点未被访问过,则递归访问,并更新当前节点的追溯值(low)。
    • 如果邻接节点的追溯值(low)大于当前节点的时间戳(dfn),则当前边是割边。
  3. 割边判定

    • 如果 low[v] > dfn[u],则边 (u, v) 是割边。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e6+10,mod=998244353;
typedef long long ll;
typedef pair<int,int> PII;
int T;
int n,m;
vector<PII> g[N];
int dfn[N],low[N],idx;
vector<int> bridge;
stack<int> stk;
vector<int> scc[N];
int cnt;
void tarjan(int u,int id)
{
    dfn[u]=low[u]=++idx;
    stk.push(u);
    for(auto j : g[u])
    {
        int v=j.first,id2=j.second;
        if(!dfn[v]) tarjan(v,id2);
        if(id!=id2) low[u]=min(low[u],low[v]);
    }
    if(low[u]==dfn[u])
    {
        bridge.push_back(id);
        cnt++;
        while(1)
        {
            int t=stk.top();
            stk.pop();
            scc[cnt].push_back(t);
            if(t==u) break;
        }
    }
    
}
signed main()
{
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int u,v;
        cin>>u>>v;
        g[u].push_back({v,i});
        g[v].push_back({u,i});
     
    }
    for(int i=1;i<=n;i++)
    {
        if(!dfn[i]) tarjan(i,-1);
    }
    //for(auto i : bridge) cout<<i<<" ";
    cout<<cnt<<endl;
    for(int i=1;i<=cnt;i++)
    {
        cout<<scc[i].size()<<" ";
        for(auto j : scc[i])
        {
            cout<<j<<" ";
        }
        cout<<endl;
    }
    return 0;
} 
## 示例代码

以下是一个使用C++实现的Tarjan算法检测割边的示例代码:

```cpp
#include<bits/stdc++.h>
using namespace std;

const int N = 2e6 + 10;
typedef pair<int, int> PII;

int n, m;
vector<PII> g[N];
int dfn[N], low[N], idx;
bool is_bridge[N];

void tarjan(int u, int p) {
    dfn[u] = low[u] = ++idx;
    for (auto &e : g[u]) {
        int v = e.first, id = e.second;
        if (!dfn[v]) {
            tarjan(v, u);
            low[u] = min(low[u], low[v]);
            if (low[v] > dfn[u]) {
                is_bridge[id] = true;
            }
        } else if (v != p) {
            low[u] = min(low[u], dfn[v]);
        }
    }
}

int main() {
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    cin >> n >> m;
    for (int i = 1; i <= m; i++) {
        int u, v;
        cin >> u >> v;
        g[u].push_back({v, i});
        g[v].push_back({u, i});
    }
    for (int i = 1; i <= n; i++) {
        if (!dfn[i]) tarjan(i, -1);
    }
    for (int i = 1; i <= m; i++) {
        if (is_bridge[i]) {
            cout << "Edge " << i << " is a bridge." << endl;
        }
    }
    return 0;
}

我的模版:
题目

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e6+10,mod=998244353;
typedef long long ll;
typedef pair<int,int> PII;
int T;
int n,m;
vector<PII> g[N];
int dfn[N],low[N],idx;
vector<int> bridge;
stack<int> stk;
vector<int> scc[N];
int cnt;
void tarjan(int u,int id)
{
    dfn[u]=low[u]=++idx;
    stk.push(u);
    for(auto j : g[u])
    {
        int v=j.first,id2=j.second;
        if(!dfn[v]) tarjan(v,id2);
        if(id!=id2) low[u]=min(low[u],low[v]);
    }
    if(low[u]==dfn[u])
    {
        bridge.push_back(id);
        cnt++;
        while(1)
        {
            int t=stk.top();
            stk.pop();
            scc[cnt].push_back(t);
            if(t==u) break;
        }
    }
    
}
signed main()
{
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int u,v;
        cin>>u>>v;
        g[u].push_back({v,i});
        g[v].push_back({u,i});
     
    }
    for(int i=1;i<=n;i++)
    {
        if(!dfn[i]) tarjan(i,-1);
    }
    //for(auto i : bridge) cout<<i<<" ";
    cout<<cnt<<endl;
    for(int i=1;i<=cnt;i++)
    {
        cout<<scc[i].size()<<" ";
        for(auto j : scc[i])
        {
            cout<<j<<" ";
        }
        cout<<endl;
    }
    return 0;
} 

标签:联通,int,割边,back,dfn,low,push,分量
From: https://www.cnblogs.com/Violetfan/p/18432781

相关文章

  • 强联通分量——Tarjan算法
    Tarjan算法详解参考文章:强连通分量Tarjan算法是一种用于寻找有向图中强联通分量(StronglyConnectedComponents,SCCs)的算法。它是由RobertTarjan在1972年提出的,基于深度优先搜索(DFS)和栈的数据结构。基本概念强联通分量:在一个有向图中,如果一组节点中任意两个节点都可以互相......
  • 软件供应链安全管理实践之中国联通
    软件供应链安全管理是保护软件开发和交付过程中所有组件的安全性和完整性的重要环节,软件供应链安全国家标准及政策的发布,为企业软件供应链安全管理提供了依据。本文摘选自软件供应链安全推进工作组指导、苏州棱镜七彩信息科技有限公司主笔的《2023软件供应链安全研究报告》中第八章......
  • 中国联通国际(联通云)-绿色低碳,共筑可持续发展未来
    在数字化浪潮席卷全球的今天,数据的安全与智能应用的无限潜力成为了企业转型与创新的关键驱动力。中国联通国际有限公司,凭借其强大的全球网络资源和深厚的技术积累,隆重推出旗下云服务品牌——联通云,旨在为全球数百万企业和开发者打造一个安全可靠、云网一体、数智相融、专属定制、......
  • 联通国际(海外)数据中心资源-提供全球热门地区的数据中心解决方案
    在全球化日益加深的今天,企业对于高效、可靠的数据中心解决方案的需求比以往任何时候都要强烈。为了帮助企业更好地拓展海外市场,中国联通国际有限公司推出了其专业的海外数据中心资源服务。这一服务旨在通过提供全球热门地区的电信级数据中心解决方案,为客户的国际化战略保驾护航。......
  • 联通云:赋能未来,云启数智新篇章
    中国联通国际有限公司产品之联通云在数字化转型的时代浪潮中,中国联通国际有限公司凭借其强大的网络基础和技术创新能力,推出了旗下云服务品牌——联通云。联通云不仅承载着让数据安全无处不在的使命,同时也开启了智能云无限可能的新篇章。它致力于为数百万企业和开发者提供一系列优......
  • 天翼云、联通云、移动云,你如何看三大运营商的云?
    从最近三大运营商2024年中期财报来看,天翼云收入552亿元、移动云收入504亿元、联通云收入317亿元,一字排开,彰显出运营商在云计算领域雄厚的发展实力,也再次说明了,拥有好的渠道体系与资源,公有云及相关业务的开拓必然会成果显赫的。不过,对于任何一朵云来说,云计算事业的辉煌成就,离不开拥......
  • 威联通NAS指南丨SMB、FTP、WebDAV等协议
    随着时代的发展,手机屏幕越来越大,拍照越来越清晰,影视画质更高清......同时也会遇到一些问题,拍照清晰了,占用内存也变大了;视频画质更好了,网盘容量跟不上了;大家对自己的数据隐私问题也更加敏感了。这时在家配置一台NAS是不错的选择,可将手机中的照片、视频备份到NAS中,告别手机内存......
  • 让联通1000M宽带2Gwifi速度达到3M/s
    提示:以下内容需要付费:看了的人好的灵魂会卖给我,女的做我的奴婢,男的做奴隶。请看:设置如下:以下因素缺一不可。1打开多媒体开关:2       设置带宽为20M/40M自动:不能设置为40M原理:因为附近的wifi数量非常多,如果设置为40M,那么信号之间干扰会很严重,我亲自试过速度会只有......
  • 强连通分量(tarjan)
    前言首先你要知道什么是强连通分量再来,不会的话我给你链接啊!好像上面那个链接已经替代了我:)tarjantarjan这个算法的演示图比较复杂,我推荐看这篇博客,这时你肯定要问了,你都推荐别人的博客了,那我看你干嘛,别急,他没给你代可以给你!我们用\(dfn[x]\)表示点\(x\)dfs序(dfs遍历......
  • 如何使用clouddrive 在QNAP 威联通中挂载阿里云盘、天翼云盘、115网盘等
    hello大家好,我是你们的新伙伴,稳重的大王~创作立场:原创不易,拒绝搬运~》》日常求粉~QNAP威联通自带的hybridmount以及HBS3,虽然可以做到挂载、同步网盘数据,但是支持的国内网盘有限,本文给大家介绍一款非常好用的软件——clouddrive文章后面贴上app安装包下载地址,下载下来之后,......