Caocao's Bridges HDU - 4738

点击打开链接

模板题 注意去重边的处理

#include 
using namespace std;
#define N 0x3f3f3f3f

struct node
{
    int v;
    int w;
    int next;
    int flag;
};

node edge[2000010];
int f[1010],first[1010],dfn[1010],low[1010];
int n,m,num;

void addedge(int u,int v,int w)
{
    edge[num].v=v;
    edge[num].w=w;
    edge[num].next=first[u];
    edge[num].flag=0;
    first[u]=num++;
    return;
}

int getf(int p)
{
    if(f[p]==p) return p;
    else
    {
        f[p]=getf(f[p]);
        return f[p];
    }
}

void unite(int u,int v)
{
    int fu,fv;
    fu=getf(u);
    fv=getf(v);
    if(fu!=fv) f[fv]=fu;
    return;
}

void dfs(int cur,int pre)
{
    int cnt,i,v;
    num++;
    dfn[cur]=num,low[cur]=num;
    cnt=0;
    for(i=first[cur];i!=-1;i=edge[i].next)
    {
        v=edge[i].v;
        if(dfn[v]==0)
        {
            dfs(v,cur);
            low[cur]=min(low[cur],low[v]);
            if(low[v]>dfn[cur])
            {
                edge[i].flag=1;
                edge[i^1].flag=1;
            }
        }
        else if(v==pre)
        {
            if(cnt>0) low[cur]=min(low[cur],dfn[v]);
            cnt++;
        }
        else
        {
            low[cur]=min(low[cur],dfn[v]);
        }
    }

    return;
}

int main()
{
    int i,u,v,w,cnt,ans;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        if(n==0&&m==0) break;
        memset(first,-1,sizeof(first));
        for(i=1;i<=n;i++) f[i]=i;
        num=0;
        for(i=1;i<=m;i++)
        {
            scanf("%d%d%d",&u,&v,&w);
            addedge(u,v,w);
            addedge(v,u,w);
            unite(u,v);
        }
        cnt=0;
        for(i=1;i<=n;i++)
        {
            if(f[i]==i) cnt++;
        }
        if(cnt>1)
        {
            printf("0\n");
            continue;
        }
        memset(dfn,0,sizeof(dfn));
        memset(low,0,sizeof(low));
        num=0;
        dfs(1,-1);
        cnt=0,ans=N;
        for(u=1;u<=n;u++)
        {
            for(i=first[u];i!=-1;i=edge[i].next)
            {
                if(edge[i].flag)
                {
                    w=edge[i].w,cnt++;
                    ans=min(ans,w);
                }
            }
        }
        if(cnt>0) printf("%d\n",max(ans,1));
        else printf("-1\n");
    }
    return 0;
}

 

你可能感兴趣的:(割点/边)