• 洛谷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

    说明

    对于全部数据,n20000,m100000

    点的编号均大于0小于等于n。

    tarjan图不一定联通。

     1 #include<cmath>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<iostream>
     5 #include<algorithm>
     6 long long read()
     7 {
     8     long long x=0,f=1;
     9     char ch=getchar();
    10     while(ch>'9'||ch<'0')
    11     {
    12         if(ch=='-')
    13             f=-1;
    14         ch=getchar();
    15     }
    16     while(ch>='0'&&ch<='9')
    17     {
    18         x=x*10+ch-'0';
    19         ch=getchar();
    20     }
    21     return x*f;
    22 }
    23 const int maxn=100005;
    24 int n,m,num,cnt,ans;
    25 int fa[maxn],low[maxn],head[maxn],dfn[maxn];
    26 struct edge
    27 {
    28     int u,v,nxt;
    29 } e[maxn<<1];
    30 bool cut[maxn];
    31 inline void add(int u,int v)
    32 {
    33     e[++num].u=u;
    34     e[num].v=v;
    35     e[num].nxt=head[u];
    36     head[u]=num;
    37 }
    38 void tarjan(int x)
    39 {
    40     int in=0;
    41     dfn[x]=low[x]=++cnt;
    42     for(int v,i=head[x]; i; i=e[i].nxt)
    43     {
    44         v=e[i].v;
    45         if(!dfn[v])
    46         {
    47             fa[v]=fa[x];
    48             tarjan(v);
    49             low[x]=fmin(low[x],low[v]);
    50             if(low[v]>=dfn[x]&&x!=fa[x])
    51                 cut[x]=true;
    52             if(x==fa[x])
    53                 ++in;
    54         }
    55         low[x]=fmin(low[x],dfn[v]);
    56     }
    57     if(x==fa[x]&&in>=2)
    58         cut[fa[x]]=true;
    59 }
    60 int main()
    61 {
    62     n=read(),m=read();
    63     for(int i=1; i<=n; ++i)
    64         fa[i]=i;
    65     for(int i=1; i<=m; ++i)
    66     {
    67         int u,v;
    68         u=read(),v=read();
    69         add(u,v);
    70         add(v,u);
    71     }
    72     for(int i=1; i<=n; ++i)
    73         if(!dfn[i])
    74             tarjan(i);
    75     for(int i=1; i<=n; ++i)
    76         if(cut[i])
    77             ++ans;
    78     printf("%d
    ",ans);
    79     for(int i=1; i<=n; ++i)
    80         if(cut[i])
    81             printf("%d ",i);
    82     return 0;
    83 }
    View Code
  • 相关阅读:
    Hadoop第一天
    Python第二天-字典类型的基本使用讲解
    Python第二天-元组的基本使用方法
    Python第二天-list基本功能详解
    Python第一天-str基本功能详解与测试
    while循环
    用户输入
    字典
    if语句
    运算符
  • 原文地址:https://www.cnblogs.com/liweilin/p/10198774.html
Copyright © 2020-2023  润新知