1.有一座桥,一把手电筒,桥的一边有四个人(a,b,c,d)每个人过桥所需的时间不同

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1.有一座桥,一把手电筒,桥的一边有四个人(a,b,c,d)每个人过桥所需的时间不同相关的知识,希望对你有一定的参考价值。

该怎么过桥
有四个人晚上过无栏杆的桥,只有一个手电(过桥必用手电),而桥最多只能同时承载两个人,A,B,C,D单独过桥,分别需要1分钟,2分钟,8分钟,问最少需要多少分钟四个人才可以全部过桥,怎么过?

参考技术A 去:a+b=2
回:a=1
去:c+d=10
回:b=2
去:a+b=2
总时间=2+1+10+2+2=17分钟

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;
        }
    }
}

以上是关于1.有一座桥,一把手电筒,桥的一边有四个人(a,b,c,d)每个人过桥所需的时间不同的主要内容,如果未能解决你的问题,请参考以下文章

转性格测试

BridgeOverARoughRiver(POJ-3404)AdHoc

进程管理之死锁

死锁及死锁的解决方法

NOIP2005过河

甲;乙;丙;丁四个人过桥,分别需要1,2,5,10分钟。因为天黑,必须借助手电筒过桥可是总共只有一个手电