zoukankan      html  css  js  c++  java
  • HDU4738 Caocao's Bridges【强连通】

    题意:

    曹操有N个岛,这些岛用M座桥连接起来,每座桥有士兵把守(也可能没有),周瑜想让这N个岛不连通,但只能炸掉一座桥,并且炸掉一座桥需要派出不小于守桥士兵数的人去,桥的守兵数为0时,也需要派出一个人去炸桥。

    思路:

    首先判断图是否连通,不连通则不需要去炸桥,输出0。图连通,则可以用Tarjan找割边,割边不存在输出-1表示不能达到目的,找到所有的割边,只需要炸掉其中守兵数最少的桥即可。

    代码:

    #include<string.h>
    #include<cstdio>
    #include<iostream>
    #define M 1111
    #define inf 0x3f3f3f3f
    using namespace std;
    
    struct st
    {
        int u,v,w,next;
    }edge[M*M*2];
    
    int head[M],dfn[M],low[M],bridge[M],n,t,index,num,mini,flag;
    
    void init()
    {
        t=0;
        memset(head,-1,sizeof(head));
    }
    
    void add(int u,int v,int w)
    {
        edge[t].u=u;
        edge[t].v=v;
        edge[t].w=w;
        edge[t].next=head[u];
        head[u]=t++;
    }
    
    void tarjan(int u,int id)
    {
        dfn[u]=low[u]=++index;
        int i;
        for(i=head[u];i!=-1;i=edge[i].next)
        {
            if(i==(1^id))continue;
            int v=edge[i].v;
            if(!dfn[v])
            {
                tarjan(v,i);
                low[u]=min(low[u],low[v]);
                if(low[v]>dfn[u])
                {
                    bridge[num++]=i;
                    if(mini>edge[i].w)
                        mini=edge[i].w;
                }
    
            }
            low[u]=min(low[u],dfn[v]);
        }
    }
    
    void solve()
    {
        index=num=flag=0;
        memset(dfn,0,sizeof(dfn));
        memset(low,0,sizeof(low));
        for(int i=1;i<=n;i++)
        {
            if(!dfn[i])
            {
                flag++;
                tarjan(i,-1);
            }
    
        }
    }
    
    int main()
    {
        int m;
        while(cin>>n>>m,n||m)
        {
            init();
            while(m--)
            {
                int a,b,c;
                cin>>a>>b>>c;
                add(a,b,c);
                add(b,a,c);
            }
            mini=inf;
            solve();
            if(flag>1)
                cout<<"0"<<endl;
            else if(num==0)
                cout<<"-1"<<endl;
            else
            {
                if(mini==0)
                    cout<<"1"<<endl;
                else
    
                    cout<<mini<<endl;
            }
        }
    }
  • 相关阅读:
    rs
    stm32f767 usoc3
    stm32f767 RTT 日志
    stm32f767 标准库 工程模板
    stm32f767 HAL 工程模板
    docker tab 补全 linux tab 补全
    docker anconda 依赖 下载 不了
    docker run 常用 指令
    linux scp 命令
    Dockerfile 常用参数说明
  • 原文地址:https://www.cnblogs.com/darklights/p/7667478.html
Copyright © 2011-2022 走看看