時間限制: 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 ...