首页 > 代码库 > 求图的割点

求图的割点

 在无向图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 }

 

求图的割点