首页 > 技术文章 > 割边

kylinbalck 2018-11-01 16:21 原文

割边

割边同割点同理。

若一个点是割边,则他所连接的\(dfn\)值较大的点的\(low\)必然比他连接的另一个点的\(dfs\)小。

#include<iostream>
using namespace std;
int head[100],next[100],to[100],cnt,num,n,m,dfn[100],low[100];
void Tarjan(int u,int fa){
    low[u]=dfn[u]=++num;
    for(int i=head[u],v;v=to[i],i;i=next[i])
        if(!dfn[v]){
            Tarjan(v,u);
            low[u]=min(low[u],low[v]);
            if(low[v]>dfn[u]) cout<<u<<"--"<<v<<endl;
        }
        else if(v!=fa) low[u]=min(low[u],dfn[v]);
}
int main(){
    cin>>n>>m;
    for(int i=1,x,y;i<=m;i++){
        cin>>x>>y;
        to[++cnt]=y,next[cnt]=head[x],head[x]=cnt;
        to[++cnt]=x,next[cnt]=head[y],head[y]=cnt;
    }
    for(int i=1;i<=n;i++)
        if(!dfn[i]) Tarjan(i,i);
    return 0;
}

欢迎指正评论O(∩_∩)O~~

推荐阅读