TZOJ 6343: 点双连通分量 (Tarjan)

描述

给定一个n个点m条边的无向连通图,求该图中“点双连通分量”的个数。

输入

第一行,n, m。

接下来m行,每行两个整数u,v,表示一条无向边(u,v)

对于100%的数据,2<=n,m<=2 * 10^5。

输出

输出点双连通分量的数量。

样例输入

5 6
1 2
2 3
1 3
3 5
4 5
3 4
 

样例输出

2

 

点双连通分量
概念

点双连通: 对于一个无向图,假如仅仅对于该图而言其中不包含割点,那么称这个图是点双连通的。

点双连通分量: 对于一个无向图中的极大点双连通的子图,我们称这个子图为点双连通分量。

算法:tarjan足以

详细的算法解释找了个佬的帖子:Tarjan算法详细讲解_致守的博客-CSDN博客icon-default.png?t=N6B9https://blog.csdn.net/tjcwt2011/article/details/107156631?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522169200561816800227429653%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=169200561816800227429653&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-2-107156631-null-null.142^v92^controlT0_2&utm_term=tarjan&spm=1018.2226.3001.4187

设定两个数组存储:

dfn[x]:记录dfs时的搜索顺序,第一次访问x的编号
low[x]:记录x所能到达的编号最小的点

然后,用DFS取遍历图

概念还是能理解的, 但是我用双链表数组做的时候,不是re,就是tle,最后还是换成了vector才安稳ac的,不知道卡在哪里。

AC代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
//dfn[x]:记录dfs时的搜索顺序,第一次访问x的编号
//low[x]:记录x所能到达的编号最小的点
const int N=2e5+10,INF=0x3f3f3f3f;
int n,m,idx=0,cnt,ans=0;
int vit[N]={0},dfn[N]={0},low[N]={0},head[N];
vector<int>vec[N];
void tarjan(int u){
    low[u]=dfn[u]=++idx;
    for(auto i:vec[u]){
        if(!dfn[i]){
            tarjan(i);
            low[u]=min(low[u],low[i]);
            if(low[i]>=dfn[u])//还是简单找割点
                ans++;
        }
        low[u]=min(low[u],dfn[i]);//保证寻找到的最小,时刻更新
    }
}
int main()
{
    ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
    memset(head,-1,sizeof head);
    cin>>n>>m;
    for(int i=1;i<=m;++i){
        int u,v;
        cin>>u>>v;
        vec[u].push_back(v);
        vec[v].push_back(u);
    }
    ans=0;
    tarjan(1);//一次就够了,不需要for循环
    cout<<ans;
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值