最大流 緊急疏散evacuate

2021-08-04 13:53:05 字數 1787 閱讀 7745

時間限制: 1 sec  

記憶體限制: 128 mb

發生了火警,所有人員需要緊急疏散!假設每個房間是乙個n m的矩形區域。每個格仔如果是".",那麼表示這是一塊空地;如果是"x",那麼表示這是一面牆,如果是"d",那麼表示這是一扇門,人們可以從這兒撤出房間。已知門一定在房間的邊界上,並且邊界上不會有空地。最初,每塊空地上都有乙個人,在疏散的時候,每一秒鐘每個人都可以向上下左右四個方向移動一格,當然他也可以站著不動。疏散開始後,每塊空地上就沒有人數限制了(也就是說每塊空地可以同時站無數個人)。但是,由於門很窄,每一秒鐘只能有乙個人移動到門的位置,一旦移動到門的位置,就表示他已經安全撤離了。現在的問題是:如果希望所有的人安全撤離,最短需要多少時間?或者告知根本不可能。

輸入檔案第一行是由空格隔開的一對正整數n與m,3<=n <=20,3<=m<=20,以下n行m列描述乙個n m的矩陣。其中的元素可為字元"."、"x"和"d",且字元間無空格。

只有乙個整數k,表示讓所有人安全撤離的最短時間,如果不可能撤離,那麼輸出"impossible"(不包括引號)。

5 5  

***xx

x...d

xx.xx

x..xx

xxdxx

3
因為每一秒門只能出乙個人,所以人可能堵住。因此要把門按時間拆點,
而答案為二分時間,只要求出空地到每扇門的最短路(最短時間),然後把此空地與門連線(時間為最短路徑到二分的時間),邊權為一。
注意拆出的新點標號別重複。。身敗名裂。。
#include#include#include#include#include#define inf 100000000

using namespace std;

int n,m,a[404][404],cnt=0,door[404],peo[404];

int tim[404][704],adj[5000000],s=0,dep[5000000],e;

int s=0,t;

char tu[25][25];

struct node

lu[5000100];

void add(int u,int v,int l)

int bfs()}}

return 0;

}int dfs(int x,int fw)

lu[i].l-=k; lu[i^1].l+=k; tmp-=k;

} }return fw-tmp;

}int check(int len)

}for(int i=1;i<=cnt;i++)

if(door[i])

int ans=0,tt;

while(bfs())

ans+=dfs(s,inf);

if(ans>=s)return 1;

return 0;

}int main()

if(tu[i][j]=='d')

}for(int k=1;k<=cnt;k++)

for(int i=1;i<=cnt;i++)

for(int j=1;j<=cnt;j++)

if(a[i][j]>a[i][k]+a[k][j])

a[i][j]=a[i][k]+a[k][j];

for(int i=1;i<=cnt;i++)

if(peo[i])

if(p==1)

} int l=0,r=600,mid,ans=600;

while(l<=r)

printf("%d",ans);

}

緊急疏散(最大子樹)

體育場突然著火了,現場需要緊急疏散,但是過道真的是太窄了,同時只能容許乙個人通過。現在知道了體育場的所有座位分布,座位分布圖是一棵樹,已知每個座位上都坐了乙個人,安全出口在樹的根部,也就是1號結點的位置上。其他節點上的人每秒都能向樹根部前進乙個結點,但是除了安全出口以外,沒有任何乙個結點可以同時容納...

緊急疏散 python

題目描述 體育場突然著火了,現場需要緊急疏散,但是過道真的是太窄了,同時只能容許乙個人通過。現在知道了體育場的所有座位分布,座位分布圖是一棵樹,已知每個座位上都坐了乙個人,安全出口在樹的根部,也就是1號結點的位置上。其他節點上的人每秒都能向樹根部前進乙個結點,但是除了安全出口以外,沒有任何乙個結點可...

HNOI2007 緊急疏散

二分 網路流判定 首先處理出每個人和門間的距離 二分時間,連邊時把每個門拆成mid個,乙個人能在mid時間內到達,他也可以在這等一會兒,那麼這mid個門之間連邊 如果可以在x的時間內到達,那麼x mid之間他都可以出去,所以門向門加一連邊 奉上未ac 千萬別複製 include define il ...