• 图论--tarjan求割点


    模板:割点
    还是那本书,自己看。
    吐槽一句:tarjan真的能干好多事儿啊QAQ
    代码:

    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    struct edge{
        int to,next;
    }e[200001];
    int n,m,tot;
    int head[100001];
    int iscut[100001];
    int dfn[100001];
    int low[100001];
    int dfn_clock;
    inline void addedge(int x,int y){
        tot++;
        e[tot].to=y;
        e[tot].next=head[x];
        head[x]=tot;
    }
    void dfs(int u,int fa){
        dfn[u]=low[u]=++dfn_clock;
        int child=0;
        for(int i=head[u];i;i=e[i].next){
            int v=e[i].to;
            if(!dfn[v]){
                child++;
                dfs(v,u);
                low[u]=min(low[u],low[v]);
                if(low[v]>=dfn[u]){
                    iscut[u]=1;
                }
            }
            else if(dfn[v]<dfn[u]&&fa!=v){
                low[u]=min(low[u],dfn[v]);
            }
        }
        if(fa<0&&child==1){
            iscut[u]=0;
        }
    }
    int main(){
        scanf("%d %d",&n,&m);
        for(int i=1;i<=m;i++){
            int x,y;
            scanf("%d %d",&x,&y);
            addedge(x,y);
            addedge(y,x);
        }
        for(int i=1;i<=n;i++){
            if(!dfn[i]){
                dfs(i,-1);
            }
        }
        int cnt=0;
        for(int i=1;i<=n;i++){
            if(iscut[i]){
                cnt++;
            }
        }
        printf("%d
    ",cnt);
        for(int i=1;i<=n;i++){
            if(iscut[i]){
                printf("%d ",i);
            }
        }
        return 0;
    }
  • 相关阅读:
    Day11作业
    day12作业
    samba共享服务
    PHP7 redis扩展安装
    linux lin命令
    PhpStorm,Pycharm,Goland破解
    PHP规范PSR2
    PHP 过滤器(Filter)
    Linux下Redis的安装与配置
    linux命令汇总
  • 原文地址:https://www.cnblogs.com/stone41123/p/7581267.html
Copyright © 2020-2023  润新知