zoukankan      html  css  js  c++  java
  • hdu 4738 Caocao's Bridges

    给出一个图,现在只能切除一个路使得整个图不联,每条路都有保安(w个),要切除这条路需要至少需要人力w人。问图要使得整个图不连通需要的最少人力。

    题解:

    这题有一个坑点,就是如果路上没有保安的情况,这种情况也是需要有人去切除路的,所以至少1人。这题有重边。。。

    #include<iostream>
    #include<math.h>
    #include<stdio.h>
    #include<algorithm>
    #include<string.h>
    #include<vector>
    #include<queue>
    #include<map>
    #include<set>
    using namespace std;
    #define B(x) (1<<(x))
    typedef long long ll;
    void cmax(int& a,int b){ if(b>a)a=b; }
    void cmin(int& a,int b){ if(b<a)a=b; }
    const int oo=0x3f3f3f3f;
    const int MOD=1000000007;
    const int maxn=1100;
    const int maxm=2100000;
    struct EDGE{
        int v,next,w;
    }E[maxm];
    int head[maxn],tol;
    int low[maxn],dfn[maxn];
    int g_cnt;
    int ans;
     
    void Init()
    {
        memset(head,-1,sizeof head);
        tol=0;
        memset(low,0,sizeof low);
        memset(dfn,0,sizeof dfn);
        g_cnt=0;
        ans=oo;
    }
     
    void add_edge(int u,int v,int w)
    {
        E[tol].w=w;
        E[tol].v=v;
        E[tol].next=head[u];
        head[u]=tol++;
    }
     
    void Tarjan(int u,int pre)
    {
        dfn[u]=low[u]=++g_cnt;
        int v;
        for(int i=head[u];i!=-1;i=E[i].next)
    	{
            if(i==(pre^1))continue;
            v=E[i].v;
            if(!dfn[v])
    		{
                Tarjan(v,i);
                if(low[v]<low[u])
                    low[u]=low[v];
                if(low[v]>dfn[u])
                    cmin(ans,E[i].w);
            }else if(dfn[v]<low[u])
                low[u]=dfn[v];
        }
    }
     
    int main(){
        //freopen("E:\read.txt","r",stdin);
        int n,m,u,v,w;
        while(scanf("%d %d",&n,&m)!=EOF)
    	{
            if(n==0&&m==0)break;
            Init();
            for(int i=1;i<=m;i++)
    		{
                scanf("%d %d %d",&u,&v,&w);
                add_edge(u,v,w);
                add_edge(v,u,w);
            }
            int cnt=0;
            for(int i=1;i<=n;i++)
                if(!dfn[i])
    			{
                    cnt++;
                    Tarjan(i,-1);
                }
            if(cnt>1) //如果不联通的话,输出0 
                ans=0;
            else 
    		    if(ans==oo) // 
                   ans=-1;
                else 
    			      if(ans==0) //有可能桥上没有人,这时要输出1 
                          ans=1;
            printf("%d
    ",ans);
        }
        return 0;
    }
    

      

  • 相关阅读:
    接口中解决默认方法冲突
    继承中的访问域问题
    继承中的多态问题
    Java中方法的调用过程
    【JS】表格获取每一列方法
    【Git报错】 ! [rejected] master -> master (fetch first)
    【Vue】vue-cli配置proxyTable调用服务器接口
    layui监听多个radio事件
    【总结】display属性inline,block,inline-block
    【实例总结】fixed定位元素内部滚动显示
  • 原文地址:https://www.cnblogs.com/cutemush/p/12688309.html
Copyright © 2011-2022 走看看