码迷,mamicode.com
首页 > 其他好文 > 详细

HDU4738 Caocao's Bridges 无向图的桥

时间:2016-05-18 00:08:41      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:

一眼题:找所有的桥,然后求最小权值

但是有很多坑点

1:如果本来不联通 输出0,(这个坑我知道)

2:但是还有一个坑,就是当整个连通,最小桥的权值是0时,也必须派一个人去,wa了无数遍(还是太年轻)

技术分享
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <string>
#include <stack>
#include <vector>
#include <map>
#include <queue>
#include <algorithm>
#include <utility>
using namespace std;
typedef long long LL;
const int N=1e3+5;
const int INF=0x3f3f3f3f;
struct Edge{
   int w,v,next;
}edge[N*N*2];
int head[N],tot,n,m;
void add(int u,int v,int w){
    edge[tot].w=w;
    edge[tot].v=v;
    edge[tot].next=head[u];
    head[u]=tot++;
}
bool instack[N];
int dfn[N],low[N],clk,cnt,ans;
void targin(int u,int f){
   dfn[u]=low[u]=++clk;
   bool flag=1;
   for(int i=head[u];~i;i=edge[i].next){
       int v=edge[i].v;
       if(flag&&v==f){
        flag=0;continue;
       }
       if(!dfn[v]){
          targin(v,u);
          low[u]=min(low[u],low[v]);
          if(low[v]>dfn[u]){
             ans=min(ans,edge[i].w);
          }
       }
       else if(dfn[v]<low[u])low[u]=dfn[v];
   }
}
int main()
{
    while(~scanf("%d%d",&n,&m)){
        if(!n&&!m)break;
        memset(head,-1,sizeof(head));
        memset(dfn,0,sizeof(dfn));
        tot=clk=0;ans=INF;
        for(int i=1;i<=m;++i){
          int u,v,w;
          scanf("%d%d%d",&u,&v,&w);
          add(u,v,w);add(v,u,w);
        }
        bool flag=0;
        for(int i=1;i<=n;++i)
         if(!dfn[i]){
            targin(i,-1);
           if(i>1)flag=1;
        }
        if(flag)ans=0;
        else if(ans==0)ans=1;
        if(ans==INF)printf("-1\n");
        else printf("%d\n",ans);
    }
    return 0;
}
View Code

 

HDU4738 Caocao's Bridges 无向图的桥

标签:

原文地址:http://www.cnblogs.com/shuguangzw/p/5503575.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!