码迷,mamicode.com
首页 > 其他好文 > 详细

求图的割点

时间:2016-09-04 06:54:22      阅读:478      评论:0      收藏:0      [点我收藏+]

标签:

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

 

求图的割点

标签:

原文地址:http://www.cnblogs.com/gzhonghui/p/5838533.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!