• 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
    ");
            else {
                if(Min==inf) Min=-1;//没法完成任务
                printf("%d
    ",!Min?1:Min);
            }
        }
        return 0;
    }
  • 相关阅读:
    C# 类总结
    VS 常见快捷键(转)
    总结C#语言命名规范 (转)
    使用DEV控件注意点
    老程序员的忠告(转)
    对结果集进行分页显示
    类库项目设定
    Oracle 分类统计sql
    开发过程中注意点
    Start with connect by prior(转)
  • 原文地址:https://www.cnblogs.com/zhanglichen/p/12315020.html
Copyright © 2020-2023  润新知