HDU4738 Caocao's Bridges

来源:互联网 发布:暖气片专用晾衣架 淘宝 编辑:程序博客网 时间:2024/05/16 05:32

双连通分量

题目传送门

明天就考试了QAQ

题目大意:给你一张无向图,问图中权值最小的桥的权值。

据说NOIp会考边双。。。赶紧学一下。

边双裸题啊,Tarjan直接缩,如果有两个及以上的连通块就直接输出-1.

注意当桥的权值为0时答案仍然是1,因为仍然需要派一个人去炸桥。

代码:

#include<cstdio>#include<cstring>#include<algorithm>#define MAXN 1000using namespace std;struct edge{    int next,to,dis;}ed[MAXN*MAXN*2+5];int n,m,k,p,num,ans;int h[MAXN+5],dfn[MAXN+5],low[MAXN+5];bool f[MAXN+5];void addedge(int x,int y,int z){    ed[k].next=h[x]; ed[k].to=y; ed[k].dis=z; h[x]=k++;}void Tarjan(int x,int e){    dfn[x]=low[x]=++p;    for (int i=h[x];~i;i=ed[i].next)        if (i!=e){            int v=ed[i].to;            if (!dfn[v]){                Tarjan(v,i^1);                low[x]=min(low[x],low[v]);                if (low[v]>dfn[x])                     ans=min(ans,ed[i].dis);            }            else low[x]=min(low[x],dfn[v]);        }    num++;}int main(){    while (scanf("%d%d",&n,&m)){        if (n==0&&m==0) break;        memset(h,-1,sizeof(h)); k=0;        for (int i=1;i<=m;i++){            int u,v,d;            scanf("%d%d%d",&u,&v,&d);            addedge(u,v,d); addedge(v,u,d);        }        p=0; ans=0x7fffffff; num=0;        memset(dfn,0,sizeof(dfn));        memset(low,0,sizeof(low));        Tarjan(1,-1);        if (num<n) printf("0\n");        else if (ans==0x7fffffff) printf("-1\n");        else if (ans==0) printf("1\n");        else printf("%d\n",ans);    }    return 0;}