求图的割点

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求图的割点相关的知识,希望对你有一定的参考价值。

 在无向图G的DFS树中,非根节点u是G的割点当且仅当u存在一个子结点v,使得v的所有后代都没有反向边连回u的祖先(不包括u)

 1 #include<iostream>
 2 #include<vector>
 3 #include<cstring>
 4 using namespace std;
 5 const int maxn=1024;
 6 int low[maxn],pre[maxn],isCut[maxn],dfs_clock=0;
 7 vector<int> G[maxn];
 8 int dfs(int u,int fa)
 9 {
10     int lowu=pre[u]=++dfs_clock;
11     int child=0;
12     for(int i=0;i<G[u].size();i++)
13     {
14         int v=G[u][i];
15         if(!pre[v])
16         {
17             child++;
18             int lowv=dfs(v,u);
19             lowu=min(lowu,lowv);
20             if(lowv>=pre[u]){
21                 isCut[u]=1;
22             }
23         }else{
24             if(pre[v]<pre[u]&&v!=fa)
25                 lowu=min(lowu,pre[v]);
26         }
27     }
28     if(fa<0&&child==1) isCut[u]=0;
29     low[u]=lowu;
30     return lowu;
31 }
32 void init()
33 {
34     memset(isCut,0,sizeof(isCut));
35     memset(pre,0,sizeof(pre));
36     memset(low,0,sizeof(low));
37 }
38 int main()
39 {
40     int n,m,f,t;
41     init();
42     cin>>n>>m;
43     for(int i=1;i<=m;i++){
44         cin>>f>>t;
45         G[f].push_back(t);
46         G[t].push_back(f);
47     }
48     dfs(1,-1);
49     for(int i=1;i<=n;i++) if(isCut[i]) cout<<i<<" is a cutNode\n";
50     return 0;
51 }

 

以上是关于求图的割点的主要内容,如果未能解决你的问题,请参考以下文章

无向图的割点

图的割点算法图的割边算法

模板割点(割顶)

模板 Tarjan割点

洛谷P3388 割点

图的割点与割边(超详细!!!)