查找图的割点的算法 基本算法

//额外增加sum数组记录最后可以生成的独立的子树的个数

#include”iostream”

#include”cstdio”

using namespace std;

int low[100];

int num[100];

int n,m;

int flag[100];

int root;

int index=0;

int sum[100];

int map[100][100];

void dfs(int cur,int father)

{

int child=0;

index++;

num[cur]=low[cur]=index;

for(int i=1;i<=n;i++)

{

if(map[cur][i]==1)

{

if(num[i]==0)

{

child++;

dfs(i,cur);

low[cur]=min(low[cur],low[i]);

if(cur!=root&&low[i]>=num[cur])     //此处选取等于的含义是当cur的下一个顶点的出边最终指向仍然是cur的时候,显然cur也是割点

{

flag[cur]=1;

sum[cur]++;

}

if(cur==root&&child>=2)

{

flag[cur]=1;

sum[cur]++;

}

}

else

{

if(i!=father)

{

low[cur]=min(low[cur],num[i]);

}

}

}

}

int main()

{

cin>>n>>m;

for(int i=1;i<=n;i++)

{

sum[i]=1;

}

for(int i=1;i<=m;i++)

{

int x,y;

cin>>x>>y;

map[y][x]=map[x][y]=1;

}

root=1;

dfs(1,root);

for(int i=1;i<=n;i++)

{

if(flag[i]==1)

{

cout<<i<<‘ ‘<<sum[i]<<endl;

}

}

return 0;

}

    原文作者:查找算法
    原文地址: https://blog.csdn.net/ltyqljhwcm/article/details/51223828
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞