zoukankan      html  css  js  c++  java
  • 洛谷 P3388 【模板】割点(割顶)

    P3388 【模板】割点(割顶)

    题目背景

    割点

    题目描述

    给出一个n个点,m条边的无向图,求图的割点。

    输入输出格式

    输入格式:

     

    第一行输入n,m

    下面m行每行输入x,y表示x到y有一条边

     

    输出格式:

     

    第一行输出割点个数

    第二行按照节点编号从小到大输出节点,用空格隔开

     

    输入输出样例

    输入样例#1:
    6 7
    1 2
    1 3
    1 4
    2 5
    3 5
    4 5
    5 6
    输出样例#1:
    1 
    5

    说明

    n,m均为100000

    tarjan 图不一定联通!!!、

    没错我以前就是不会,不服bb别solo

    #include<bits/stdc++.h>
    using namespace std;
    #define maxn 1000000
    int n,m,x,y,tot,tim,dfn[maxn],low[maxn],head[maxn],ans;
    int cut_edge[maxn],cut_point[maxn];
    bool vis[maxn];
    struct Edge{
        int next,to,from;
    }edge[maxn];
    
    void add(int x,int y)
    {
        edge[tot].to=y;
        edge[tot].next=head[x];
        head[x]=tot;
        tot++;
    }
    
    void tarjan(int now,int pre)
    {
        int sum=0;
        bool if_=false;
        vis[now]=true;
        dfn[now]=low[now]=++tim;
        for(int i=head[now];i!=-1;i=edge[i].next)
        {
            int v=edge[i].to;
            if((i^1)!=pre)
            {
                if(!vis[v])
                {
                    sum++;
                    tarjan(v,i);
                    if(low[v]>dfn[now]) cut_edge[i/2]=1;
                    if(low[v]>=dfn[now]) if_=true;
                    low[now]=min(low[now],low[v]);
                }
                else low[now]=min(low[now],dfn[v]);
            }
        }
        if(pre==-1) 
        {
            if(sum>1)
            cut_point[now]=1;
        }
        else if(if_==1) cut_point[now]=1;
        return ;
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        memset(head,-1,sizeof(head));
        for(int i=1;i<=m;i++)
            scanf("%d%d",&x,&y),add(x,y),add(y,x);
        for(int i=1;i<=n;i++)
            if(!vis[i]) tarjan(i,-1);
        for(int i=1;i<=n;i++)
            if(cut_point[i]) ans++;
        printf("%d
    ",ans);
        for(int i=1;i<=n;i++) if(cut_point[i]) printf("%d ",i);
        return 0;
    }
  • 相关阅读:
    poj2187 Beauty Contest 旋转卡壳
    2017/8/6 考试吐槽
    bzoj2618 凸多边形 半平面交
    cogs1600 奶牛冰壶 计算几何
    cogs896 圈奶牛 凸包
    cogs1743 忠诚 zkw
    BZOJ 3224 普通平衡树 平衡树的两种姿势:SBT,splay。01trie
    BZOJ 3196 二逼平衡树
    BZOJ 1901 Dynamic Rankings
    BZOJ 4325[NOIP2015]斗地主
  • 原文地址:https://www.cnblogs.com/chen74123/p/7424955.html
Copyright © 2011-2022 走看看