【模板】无向图的割顶和桥

#include<bits/stdc++.h>
using namespace std;
int n,m,top,color_num;
vector<int>g[100010];
struct edge
{
    int s,t;
};
int low[100010],dfn[100010],color[100010];
stack<edge>my_stack;
vector<edge>ans;
bool is_cut[100010];
int cnt=0;
//寻找无向图的割顶(删除此点后图不连通) 
void find_cut(int x,int pre)
{
    int child=0;
    low[x]=dfn[x]=++cnt;
    for(int i=0;i<g[x].size();i++)
    {
        int to=g[x][i];
        if(to==pre)continue;
        if(!dfn[to])
        {
            child++;
            find_cut(to,x);
            low[x]=min(low[x],low[to]);
            if(low[to]>=dfn[x])is_cut[x]=true;
        }
        else if(dfn[to]<dfn[x])low[x]=min(low[x],dfn[to]);
    }
    if(pre==-1&&child==1)is_cut[x]=false;
    return;
}
//寻找无向图的桥(删除此边后图不联通) 
void find_bridge(int x,int pre)
{
    dfn[x]=low[x]=++cnt;
    int to;
    for(int i=0;i<g[x].size();i++)
    {
        to=g[x][i];
        if(to==pre)continue;
        if(!dfn[to])
        {
            find_bridge(to,x);
            low[x]=min(low[x],low[to]);
            if(low[to]>dfn[x])ans.push_back((edge){x,to});
        }
        else low[x]=min(low[x],dfn[to]);
    }
    return;
}
int main()
{
    cin>>n>>m;
    int a,b;
    for(int i=1;i<=m;i++)
    {
        cin>>a>>b;
        g[a].push_back(b);
        g[b].push_back(a);
    }
    return 0;
}
0%