求图的割点
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 }
以上是关于求图的割点的主要内容,如果未能解决你的问题,请参考以下文章