zoukankan      html  css  js  c++  java
  • 洛谷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;
    }
    
  • 相关阅读:
    jquery保存用户名和密码到cookie里面
    avalon框架
    mybatis分页插件
    获取前台查询条件的公用方法
    mybatis分页插件
    maven出错The folder is already a source folder
    Jquery图片上传预览效果
    springMVC文件上传
    自动将String类型的XML解析成实体类
    JavaScript 引擎
  • 原文地址:https://www.cnblogs.com/grcyh/p/10142830.html
Copyright © 2011-2022 走看看