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;
            }
        }
    }
  • 相关阅读:
    iOS_文件上传进度条的实现思路-AFNettworking
    快手为什么成功
    Swift 3.1 的一些新特性
    字典类型的字符串转成字典
    phpmyadmin通过日志文件拿webshell
    计算机网络基础知识
    写一个php小脚本辅助渗透测试
    Zabbix exp编写
    sqlmap里如何添加字典
    过狗注入学习姿势分享2[投稿华盟网]
  • 原文地址:https://www.cnblogs.com/darklights/p/7667478.html
Copyright © 2011-2022 走看看