1.有一座桥,一把手电筒,桥的一边有四个人(a,b,c,d)每个人过桥所需的时间不同
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1.有一座桥,一把手电筒,桥的一边有四个人(a,b,c,d)每个人过桥所需的时间不同相关的知识,希望对你有一定的参考价值。
该怎么过桥
有四个人晚上过无栏杆的桥,只有一个手电(过桥必用手电),而桥最多只能同时承载两个人,A,B,C,D单独过桥,分别需要1分钟,2分钟,8分钟,问最少需要多少分钟四个人才可以全部过桥,怎么过?
回: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)每个人过桥所需的时间不同的主要内容,如果未能解决你的问题,请参考以下文章