hdu 4738 Caocao's Bridges(双联通)

来源:互联网 发布:php hadoop 编辑:程序博客网 时间:2024/05/22 05:03

一个无向图  炸一个桥  使无向图分成两个以上部分 问所炸桥的最小权值  。

#pragma comment(linker, "/STACK:1024000000,1024000000")#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<queue>#include<map>using namespace std;#define ma_pa(a,b) make_pair(a,b)#define clr(x) memset(x,0,sizeof(x))#define maxn 2010#define maxm 2100000#define INF 0x1f1f1f1fstruct node{    int to,next;}e[maxm],e2[maxm];int head[maxn],tot;int head2[maxn],tot2;int col[maxn],dfn[maxn],low[maxn],sta[maxn];int top,ti,scc;  //scc 双联通分支个数int n,m;bool vis[maxn];void init(){    memset(head,-1,sizeof(head));    clr(vis);    clr(dfn);    tot=0;    top=0;    scc=ti=0;}void add(int u,int v){    e[tot].to=v;    e[tot].next=head[u];    head[u]=tot++;}void tarjan(int u,int fa){    dfn[u]=low[u]=++ti;    sta[++top]=u;    vis[u]=true;    int cnt=0;    for(int i=head[u];i!=-1;i=e[i].next){        int v=e[i].to;        if(!dfn[v]){            tarjan(v,u);            low[u]=min(low[u],low[v]);        }        else if(fa==v){            if (cnt) low[u] = min(low[u],dfn[v]);//重边            cnt++;        }        else if(vis[v])low[u]=min(low[u],dfn[v]);    }    if(dfn[u]==low[u]){        int x;        scc++;        do{            x = sta[top--];            vis[x]=false;            col[x] = scc;        }while(x!=u);    }}int father[4010];int find(int x){    if(father[x]==x)return x;    return father[x]=find(father[x]);}bool join(int x,int y){    x=find(x);    y=find(y);    if(x==y)return false;    if(x>y){father[x]=y;}    if(x<y){father[y]=x;}    return true;}struct node1{    int x,y;}road[2100000];int main(){    int u,v,w,i;    while(scanf("%d%d",&n,&m)!=EOF){        init();        map<pair<int,int>,int>mp;        mp.clear();        for(i=0;i<=n;i++){            father[i]=i;        }        if(n==0&&m==0)break;        int ppp=INF;        for(int i=0;i<m;i++){            scanf("%d%d%d",&u,&v,&w);            if(v==u)continue;            add(u,v);            add(v,u);            join(u,v);            ppp=min(ppp,w);            if(mp[ma_pa(u,v)]==0){                mp[ma_pa(u,v)]=w;                mp[ma_pa(v,u)]=w;            }            else {                mp[ma_pa(u,v)]=min(mp[ma_pa(u,v)],w);                mp[ma_pa(v,u)]=mp[ma_pa(u,v)];            }        }        int fff=0;        for(i=1;i<=n;i++){            if(find(i)!=1)fff=1;        }        if(fff){printf("0\n");continue;}        tarjan(1,-1);        if(scc==0){            printf("%d\n",ppp);            continue;        }        if(scc==1){            printf("-1\n");            continue;        }        int res=INF;        for(int i = 1; i <= n; i++){            for(int j = head[i]; j!=-1; j = e[j].next){                int v = e[j].to;                if(col[i]!=col[v]){                    res=min(res,mp[ma_pa(i,v)]);                }            }        }        if(res==0)printf("1\n");        else printf("%d\n",res);    }    return 0;}


原创粉丝点击