无向图的割点和桥
无向图的割点和桥
1.割点
# include <bits/stdc++.h>
using namespace std;
const int MAXN=2e4+100;
vector<int> G[MAXN];
int dfn[MAXN],iscut[MAXN],low[MAXN]; //iscut[i]表示i是割点
int dfs_clock=0;
void init()
{
    dfs_clock=0;
    for(int i=1;i<MAXN;++i) G[i].clear();
    memset(iscut,0,sizeof(iscut));
    memset(low,0,sizeof(low));
    memset(dfn,0,sizeof(dfn));
}
int dfs(int u,int fa)
{
    int lowu; lowu=dfn[u]=++dfs_clock;
    int child=0;
    int len=G[u].size();
    for(int i=0;i<len;++i){
        int v=G[u][i];
        if(!dfn[v]){
            child++;
            int lowv=dfs(v,u);
            lowu=min(lowu,lowv);
            if(lowv>=dfn[u]){ //如果求桥,去掉等号
                iscut[u]++;
            }
        }else if(dfn[v]<dfn[u]&&v!=fa){
            lowu=min(lowu,dfn[v]);
        }
    }
    if(fa<0&&child==1) iscut[u]=0;
    else if(fa<0&&child>=2) iscut[u]=child-1;
    return low[u]=lowu;
}
int main()
{
    init();
    int n,m; scanf("%d%d",&n,&m);
    while(m--){
        int u,v; scanf("%d%d",&u,&v);
         
                    
                     
                    
                