HNOI2007 緊急疏散

2021-08-14 08:27:46 字數 1635 閱讀 1532

二分+網路流判定

首先處理出每個人和門間的距離

二分時間,連邊時把每個門拆成mid個,乙個人能在mid時間內到達,他也可以在這等一會兒,那麼這mid個門之間連邊

如果可以在x的時間內到達,那麼x~mid之間他都可以出去,所以門向門加一連邊

奉上未ac**千萬別複製

# include 

# define il inline

# define rg register

# define fill(a, b) memset(a, b, sizeof(a))

# define copy(a, b) memcpy(a, b, sizeof(a))

using

namespace

std;

typedef

long

long ll;

const

int _(1010), __(1e6 + 10), inf(2147483647);

il ll read()

int n, m, mp[30][30], cntr, cntd, dis[_][_], id[_][_];

int tcnt, tmp1[_ * 100], tmp2[__], w[__], fst[_ * 100], nxt[__], to[__], cnt, s, t, lev[_ * 100], cur[_ * 100], max_flow;

queue

q;il void add(rg int u, rg int v, rg int f)

il int dfs(rg int u, rg int maxf)

return ret;

}il bool bfs()

}return lev[t];

}il int maxflow()

struct data u;

queue

que;

int dx = , dy = , vis[_][_];

il void bfs(rg int x, rg int y, rg int id)); vis[x][y] = 1;

while(!que.empty()));}}

}il int check(rg int x)

for(rg int i = 1; i <= cntr; ++i)

for(rg int j = 1; j <= cntd; ++j)

if(dis[i][j] && dis[i][j] <= x) add(i, cntr + x * (j - 1) + dis[i][j], inf);

return maxflow();

}int main(rg int argc, rg char* argv)

}for(rg int i = 1; i <= n; ++i)

for(rg int j = 1; j <= m; ++j)

if(!mp[i][j]) bfs(i, j, id[i][j]);

rg int l = 0, r = 400, ans = -1;

while(l <= r)

ans == -1 ? puts("impossible") : printf("%d\n", ans);

return

0;}

HNOI2007 緊急疏散

bzoj1189 luogu3191 看上去很像網路流但是還是不會做啊!正解要二分答案然後網路流判定能否走出去,因為乙個時刻只能出去乙個人,所以門是有流量限制的,這樣看是否滿流就行了。然後建圖要注意只有能到的點才向門連邊,不要 穿牆 upd bzoj的資料好像卡了這種建圖方法 所以要把門拆成時刻建圖...

HNOI2007 最小矩形覆蓋

給定一些點的座標,要求求能夠覆蓋所有點的最小面積的矩形,輸出所求矩形的面積和四個頂點座標 輸入格式 第一行為乙個整數n 3 n 50000 從第2至第n 1行每行有兩個浮點數,表示乙個頂點的x和y座標,不用科學計數法 輸出格式 第一行為乙個浮點數,表示所求矩形的面積 精確到小數點後5位 接下來4行每...

HNOI2007 最小矩形覆蓋

給定一些點的座標,要求求能夠覆蓋所有點的最小面積的矩形,輸出所求矩形的面積和四個頂點座標 第一行為乙個整數n 3 n 50000 從第2至第n 1行每行有兩個浮點數,表示乙個頂點的x和y座標,不用科學計數法 第一行為乙個浮點數,表示所求矩形的面積 精確到小數點後5位 接下來4行每行表示乙個頂點座標,...