无向图的割点、桥

版权声明:本文为博主原创文章,未经博主允许必须转载。 https://blog.csdn.net/qq_35950004/article/details/83548604
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<stack>
#include<queue>
#define maxn 100005
using namespace std;

int n,m,dfn[maxn],low[maxn],tim,scc,cut,brg,iscut[maxn];
bool insta[maxn];
vector<int>g[maxn],ans;
stack<int>sta;

void dfs(int now,int fa){
    dfn[now]=low[now]=++tim;
    bool flag=0; int k = 0;
    for(int i=0,siz=g[now].size(),v;i<siz;i++){
        if(!dfn[v=g[now][i]]){ k++;
            dfs(v,now),low[now]=min(low[v],low[now]);
            if(low[v]>=dfn[now])  iscut[now]=1;
			if(low[v]>dfn[now]) brg++;
        }
        else if(v!=fa)
            low[now]=min(low[now],dfn[v]);
    }
    
	if(!fa && k==1) iscut[now]=0;
}

void tarjan(){
    memset(dfn,0,sizeof dfn);
    memset(low,0,sizeof low);
    tim=0,scc=0;
    for(int i=1;i<=n;i++)
        if(!dfn[i])
            dfs(i,0);
}

int main(){
    scanf("%d%d",&n,&m);
        
    int u,v;
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&u,&v);
        g[u].push_back(v),
        g[v].push_back(u);
    }
    
    tarjan();
    
	for(int i=1;i<=n;i++)
		if(iscut[i])
			cut++;
    printf("%d\n%d",cut,brg);
}

猜你喜欢

转载自blog.csdn.net/qq_35950004/article/details/83548604