图的割边--仅仅与割点有一个等号的差别

#include<iostream>
#include<cstdio>
using namespace std;
int u[1024],v[1024];
int first[1024],Next[1024];
int root,index=1,num[1024],low[1024];
bool book[1024];
int n,m;

void dfs(int cur,int father)
{
    low[cur]=num[cur]=index++;
    int k=first[cur];
    while(k!=-1){
        if(num[v[k]]==0){
            dfs(v[k],cur);
            low[cur]=min(low[v[k]],low[cur]);
            if(low[v[k]]>num[cur]){
                book[k]=1;
                cout<<u[k]<<"   "<<v[k]<<endl;
            }
        }
        else if(v[k]!=father){
            low[cur]=min(low[cur],num[v[k]]);
        }
        k=Next[k];
    }
}

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++){
        scanf("%d%d",&u[i],&v[i]);
    }
    fill(first,first+n+1,-1);

    for(int i=1;i<=m;i++){
        u[i+m]=v[i];
        v[i+m]=u[i];
    }

    for(int i=1;i<=2*m;i++){
        Next[i]=first[u[i]];
        first[u[i]]=i;
    }

    root = 1;
    dfs(1,root);


}

   代码参考于《啊哈,算法》

posted @ 2018-06-01 09:27  断腿三郎  阅读(172)  评论(0编辑  收藏  举报