首页 > 代码库 > 求图的割点
求图的割点
在无向图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 }
求图的割点
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。