HDU4738 Caocao's Bridges

求无向图的桥的最小权值~

巨坑!!!

如果一开始就不连通的话,就不用派士兵~

如果最小的桥边是0的话,要派一个士兵~

可能两个地方有两座桥连接,这种桥不予考虑,因为怎么拆都连通QAQ

tarjan算法求桥~~~

#include<cstdio>
#include<algorithm>
#include<vector>
#include<stack>
#include<cstring>
using namespace std;
const int maxn=1014;
const int inf=1e9;
int g[maxn][maxn];
int vis[maxn][maxn];
int N,M,x,y;
int low[maxn];
int dfn[maxn];
int cnt;
int Min;
void init () {
    fill(low,low+maxn,0);
    fill(dfn,dfn+maxn,0);
    Min=inf;
    for (int i=0;i<maxn;i++)
    for (int j=0;j<maxn;j++) 
    g[i][j]=inf,vis[i][j]=0;
    cnt=0;
}
void tarjan (int x,int pre) {
    low[x]=dfn[x]=++cnt;
    for (int i=1;i<=N;i++) {
        if (i==pre) continue;
        if (g[x][i]==inf) continue;
        if (!low[i]) {
            tarjan(i,x);
            low[x]=min(low[x],low[i]);
            if (low[i]>dfn[x]) {
                if (!vis[x][i]) Min=min(g[x][i],Min);
            }
        }
        else low[x]=min(low[x],dfn[i]);
    }
}
int main(){
    int u,v,w;
    while(~scanf("%d%d",&N,&M)) {
        if (N==0&&M==0) break;
        init();
        for(int i=0;i<M;i++) {
            scanf("%d%d%d",&u,&v,&w);
            if (g[u][v]!=inf) vis[u][v]=vis[v][u]=1;
            else g[u][v]=g[v][u]=w;
        }
        tarjan(1,1);
        for (int i=1;i<=N;i++) if (!dfn[i]) Min=-2;
        if (Min==-2) printf("0\n");
        else {
            if(Min==inf) Min=-1;//没法完成任务
            printf("%d\n",!Min?1:Min);
        }
    }
    return 0;
}

 

posted @ 2020-02-15 22:45  zlc0405  阅读(114)  评论(0编辑  收藏  举报