https://vjudge.net/problem/HDU-4738#author=Dillydally
思路:

1.注意重边处理。
2.守卫为0时,也需要派一个人;
3.如果原本图不连通,就不需要派人。
4.然后直接输出桥的最小边权就可以了。
相对简单,详情不再赘述

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int N=1e3+5,M=1e6+5;
int head[N],edge[M],ver[M],Next[M];
int dfn[N],low[N],n,m,tot,num,cnt,ans;
bool bridge[M];
void add(int x,int y,int z){
    ver[++tot]=y,edge[tot]=z,Next[tot]=head[x],head[x]=tot;
}
void tarjan(int x,int in_edge){
    dfn[x]=low[x]=++num;
    for(int i=head[x];i;i=Next[i]){
        int y=ver[i];
        if(!dfn[y]){
            tarjan(y,i);
            low[x]=min(low[x],low[y]);
            if(low[y]>dfn[x])
                bridge[i]=bridge[i^1]=true;
        }
        else if(i!=(in_edge^1))
            low[x]=min(low[x],dfn[y]);
    }
}
void init(){
    tot=1,ans=1e9,num=0,cnt=0;
    memset(dfn,0,sizeof dfn);
    memset(low,0,sizeof low);
    memset(bridge,false,sizeof bridge);
    memset(head,0,sizeof head);
}
int main(){
    while(~scanf("%d%d",&n,&m)&&n&&m){
        init();
        for(int i=1;i<=m;i++){
            int x,y,z;
            scanf("%d%d%d",&x,&y,&z);
            add(x,y,z);add(y,x,z);
        }
        for(int i=1;i<=n;i++)
            if(!dfn[i])    tarjan(i,0),cnt++;
        for(int i=2;i<tot;i+=2){
            if(!bridge[i])    continue;
            ans=min(ans,edge[i]);
        }
        if(cnt==1)    printf("%d\n",ans==1e9?-1:(ans==0?1:ans));
        else        printf("%d\n",0);
    }
    return 0;
}