模板割点(割顶)(洛谷_3388)——tarjan

Posted Yzyet

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模板割点(割顶)(洛谷_3388)——tarjan相关的知识,希望对你有一定的参考价值。

tarjan求割点,打了个模板题。

#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
inline int read(){
    int t=1,num=0;char c=getchar();
    while(c>\'9\'||c<\'0\'){if(c==\'-\')t=-1;c=getchar();}
    while(c>=\'0\'&&c<=\'9\'){num=num*10+c-\'0\';c=getchar();}
    return num*t;
}
#define min(a,b) a<b?a:b
const int N=100010;
vector<int> g[N];
int cut[N],dfn[N],low[N];
int n,m,t=0,cnt=0;
void dfs(int x,int fa){
    dfn[x]=low[x]=++t;int child=0;
    for(int i=0;i<g[x].size();i++){
        int y=g[x][i];if(y==fa)continue;
        if(!dfn[y]){
            dfs(y,x);child++;
            low[x]=min(low[x],low[y]);
            if(low[y]>=dfn[x])cut[x]=1;
        }
        else low[x]=min(low[x],dfn[y]);
    }
    if(fa==-1&&child<=1&&cut[x])cut[x]=0;
}
int main()
{
    n=read();m=read();
    for(int i=1;i<=m;i++){
        int x=read(),y=read();
        g[x].push_back(y);
        g[y].push_back(x);
    }
    for(int i=1;i<=n;i++)
        if(!dfn[i])dfs(i,-1);
    for(int i=1;i<=n;i++)
        if(cut[i])cnt++;
    printf("%d\\n",cnt);
    for(int i=1;i<=n;i++)
        if(cut[i])printf("%d ",i);
    return 0;
}

本文由Yzyet编写,网址为www.cnblogs.com/Yzyet。非Yzyet同意,禁止转载,侵权者必究。

以上是关于模板割点(割顶)(洛谷_3388)——tarjan的主要内容,如果未能解决你的问题,请参考以下文章

洛谷 P3388 模板割点(割顶)

洛谷P3388 模板割点(割顶)

Luogu P3388 模板割点(割顶)

P3388 模板割点(割顶)

luogu P3388 模板割点(割顶)

P3387 模板缩点 && P3388 模板割点(割顶)