首页 > 其他分享 >【板子】强连通分量(SCC)

【板子】强连通分量(SCC)

时间:2024-01-26 20:56:16浏览次数:30  
标签:连通 int SCC stk dfn scccnt low 板子 instk

//强连通分量
//lg 2863 求强连通分量的数量
#include<bits/stdc++.h>
using namespace std;

const int N = (int)2e4+4;

int where[N];//这个点在哪个scc里
int scccnt;
int sccsize[N];
int low[N],dfn[N],idx;
bool instk[N];
stack<int> stk;

vector<int> e[N];
int n,m;

void Tarjan(int u)
{
    dfn[u]=low[u]=++idx;
    instk[u]=true;
    stk.push(u);
    for(int v : e[u])
    {
        if(!dfn[v])
        {
            Tarjan(v);
            low[u]=min(low[u],low[v]);
        }
        else if(instk[v])
        {
            low[u]=min(low[u],dfn[v]);
            //low[u]=min(low[u],low[v]);
        }
    }
    if(dfn[u]==low[u])
    {
        scccnt++;
        while(stk.top()!=u)
        {
            instk[stk.top()]=false;
            where[stk.top()]=scccnt;
            sccsize[scccnt]++;
            stk.pop();
        }
        sccsize[scccnt]++;
        where[u]=scccnt;
        instk[u]=false;
        stk.pop();
    }
}

int main()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        e[u].push_back(v);
    }
    for(int i=1;i<=n;i++)
    {
        Tarjan(i);
    }
    int cnt=0;
    for(int i=1;i<=scccnt;i++)
    {
        if(sccsize[i]>1) cnt++;
    }
    cout<<cnt;
    return 0;
}

标签:连通,int,SCC,stk,dfn,scccnt,low,板子,instk
From: https://www.cnblogs.com/yeyou26/p/17990686

相关文章

  • 【板子】字符串哈希
    //lgp3370//Copyrightyeyou26#include<bits/stdc++.h>usingnamespacestd;#defineullunsignedlonglongstrings;intn;constullp=998244353;ullnow_hash;ullv[100005];intcnt;intans;voidget_hash();voiddo_compare();voidinit()......
  • 【板子】字符串最小表示法
    //lgp1368//Copyrightyeyou26#include<bits/stdc++.h>usingnamespacestd;longlonga[600005];intn;voidinit();voidsolve(){inti=1,j=2,k=0;while(i<=n&&j<=n){k=0;while(a[i+k]==a[j+k]&&am......
  • 【板子】KMP
    //lgp3375//Copyrightyeyou26#include<bits/stdc++.h>usingnamespacestd;charp[1000005],s[1000005];intlenp,lens;intlst[1000005];voidinit();voidpre_work();voidkmp();voidout_put();intmain(){freopen("working.in",&qu......
  • 连通性问题
    求割点#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constllN=2e4+10;lln,m,dfn[N],low[N],tot,root;boolcut[N];vector<ll>G[N];voidtarjan(llu){ dfn[u]=low[u]=++tot; llflag=0; for(autov:G[u]){ if(!dfn[v]){ ta......
  • 一些神奇の小公式&板子
    一些神奇の小公式$n$以内的质数个数为:​ $n/\logn*\sqrt{n}$$n$个点的距离平方和:​ $n*(\sumx_i+\sumy_i)-[(\sumx_i)^2+(\sumy_i)^2]$一些神奇の板子万年不变万能(火车)头#include<algorithm>#include<iostream>#include<string.h>#include<stdio.h>#inc......
  • 板子集合
    tarjan点击查看代码//缩点voidtarjan(intu){dfn[u]=low[u]=++t;s[++top]=u;vis[u]=1;for(inti=0;i<g[u].size();++i){intv=g[u][i];if(!dfn[v]){tarjan(v);low[u]=min(low[u],low[v]);}elseif(vis[v])low[u]=......
  • C++U5-第03课-深度优先搜索3-连通块类型
    学习目标 本节课主要学习一种类型的深度优先搜索-连通块  [数水坑]  【思路分析】相连的水坑可以被认为是一个水坑,求水坑的个数,就是求连通块的个数。可以采用搜索来访问每个点。每访问到一个W表示至少有一个水坑,通过搜索8个方向,得到这个点连通的所有的......
  • 网络连通性测试 【Connectivity】
    CFD简介CFD(ConnectivityFaultDetection,连通错误检测)是一种二层网络中的端到端OAM(Operation,Administration,andMaintenance,操作、管理和维护)技术,主要用于在二层网络中检测链路连通性,以及在故障发生时进行定位。适用的二层网络包括基于VLAN的以太网网络和基于MPLS的二层V**。......
  • 如何区别随身WiFi板子是什么芯片
    新上车的朋友可以看看,中兴微的板子上面都有zxlc,高通骁龙的一般都会有骁龙字样,一般主芯片会大一点放了几张板子的图片,让大家区别一下。这个是中兴微一定要把屏蔽罩打开,才能看到这个是高通骁龙的410......
  • 很有意思的一次周赛,虽然被打爆了,呜呜,动了四题,只ac一道板子
    第三次周赛题解A.前缀和观察题cao分奇偶注意观察---奇数()只有第一个和第二个会是奇数后面全是前面累乘2if(x%2!=0)x要么是第一个要么是第二个(无区别)因为1,2元素大小相等剩下元素a[n]=pow(2,n-2)*x;else不是奇数化为奇数llq=x;//保存一下结果,后面要特判whil......