• 洛谷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 le 20000)(m le 100000)

    点的编号均大于(0)小于等于(n)

    tarjan图不一定联通。

    思路:一道求割点的模板题,如果一个点为割点,当且仅当去掉这个点和连向这个点的边之后,整张图不再联通。那么问题可以转化为,一个点的子结点必须经过这个点才能到达其他的不是这个点的子结点的点,如果这个点是根,那么只需要判断它的孩子数目是否大于等于2即可,如果是,则这个点一定是割点。

    代码:

    #include<cstdio>
    #include<algorithm>
    #define maxn 20007
    using namespace std;
    int n,m,head[maxn],dfn[maxn],low[maxn],bel[maxn],size[maxn],num,cnt,js,zrj;
    bool vis[maxn],bj[maxn];
    struct node {
      int v,nxt;
    }e[200007];
    inline void ct(int u, int v) {
      e[++num].v=v;
      e[num].nxt=head[u];
      head[u]=num;
    }
    void tarjan(int u, int fa) {
      int child=0;
      dfn[u]=low[u]=++cnt;
      for(int i=head[u];i;i=e[i].nxt) {
        int v=e[i].v;
        if(!dfn[v]) {
          tarjan(v, fa);
          low[u]=min(low[u],low[v]);
          if(u!=fa&&low[v]>=dfn[u]) bj[u]=1;
          if(u==fa) child++;
        }
        low[u]=min(low[u],dfn[v]);
      }
      if(u==fa&&child>=2) bj[u]=1;
    }
    int main() {
      scanf("%d%d",&n,&m);
      for(int i=1,u,v;i<=m;++i) {
        scanf("%d%d",&u,&v);
        ct(u,v),ct(v,u);
      }
      for(int i=1;i<=n;++i) if(!dfn[i]) tarjan(i,i);
      for(int i=1;i<=n;++i) if(bj[i]) zrj++;  
      printf("%d
    ",zrj);
      for(int i=1;i<=n;++i) if(bj[i]) printf("%d ",i);
      printf("
    ");
      return 0;
    }
    
  • 相关阅读:
    【luogu P1343 地震逃生】 题解
    【luogu P3931 SAC E#1
    【luogu P3275 [SCOI2011]糖果】 题解
    【luogu P2947 [USACO09MAR]向右看齐Look Up】 题解
    【luogu P1456 Monkey King】 题解
    【luogu P3377 左偏树(可并堆)】 模板
    【luogu P1993 小K的农场】 题解
    Sqlmap注入Base64编码的注入点
    kali高速更新源以及主题修改方法
    DiscuzX3.1搬家全过程
  • 原文地址:https://www.cnblogs.com/grcyh/p/10142830.html
Copyright © 2020-2023  润新知