zoukankan      html  css  js  c++  java
  • tarkjan求无向图割点模板

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 
     5 int n,m;
     6 const int maxn=1e5+2;
     7 const int maxm=maxn<<1;
     8 struct node
     9 {
    10     int to;
    11     int nxt;
    12 }e[maxm];
    13 int head[maxn];
    14 int tot;
    15 int id;
    16 int root;
    17 int low[maxn];
    18 int num[maxn];
    19 bool vis[maxn];
    20 int pa[maxn];
    21 int cnt=0;
    22 int art[maxn];
    23 void init()
    24 {
    25     memset(head,-1,sizeof(head));
    26     tot=0;
    27     id=0;
    28     memset(low,-1,sizeof(low));
    29     memset(num,-1,sizeof(num));
    30     memset(vis,false,sizeof(vis));
    31     memset(pa,-1,sizeof(pa));
    32     cnt=0;
    33     memset(art,0,sizeof(art));
    34 }
    35 void add(int u,int v)
    36 {
    37     e[tot].to=v;
    38     e[tot].nxt=head[u];
    39     head[u]=tot++;
    40 }
    41 void findArt(int u)
    42 {
    43     vis[u]=true;
    44     low[u]=num[u]=++id;
    45     for(int i=head[u];i!=-1;i=e[i].nxt)
    46     {
    47         int v=e[i].to;
    48         //树边
    49         if(!vis[v])
    50         {
    51             pa[v]=u;
    52             findArt(v);
    53             if(low[v]>=num[u]&&u!=root)
    54             {
    55                 art[cnt++]=u;
    56             }
    57             low[u]=min(low[u],low[v]);
    58         } 
    59         else if(pa[v]!=u) //回退边
    60         {
    61             low[u]=min(low[u],num[v]);
    62         } 
    63     }
    64 }
    65 
    66 void printArt()
    67 {
    68     int tmp=0; 
    69     for(int i=head[root];i!=-1;i=e[i].nxt)
    70     {
    71         if(pa[e[i].to]==root) tmp++;
    72     }
    73     if(tmp>=2) art[cnt++]=root;
    74     for(int i=0;i<cnt;i++)
    75     {
    76         printf("%d ",art[i]);
    77     }
    78     puts("");
    79 }
    80 
    81 int main()
    82 {
    83     while(~scanf("%d%d",&n,&m))
    84     {
    85         init();
    86         int u,v;
    87         for(int i=1;i<=m;i++)
    88         {
    89             scanf("%d%d",&u,&v);
    90             add(u,v);
    91             add(v,u);
    92         }
    93         root=1;
    94         findArt(root);
    95         printArt();
    96     }
    97     return 0;
    98  } 
    Tarkjan求无向图割点

    http://www.cnblogs.com/llhthinker/p/4954082.html

  • 相关阅读:
    1、MyBatis 快速入门
    1、Spring Framework入门
    1、基本数据类型
    2020软件工程个人作业06
    谭山明月有秋水--事后诸葛亮
    谭山明月有秋水——项冲刺第七天
    谭山明月有秋水——冲刺第六天
    谭山明月有秋水——冲刺第一天
    谭山明月有秋水——冲刺第二天
    谭山明月有秋水——冲刺第三天
  • 原文地址:https://www.cnblogs.com/itcsl/p/7764457.html
Copyright © 2011-2022 走看看