二分+網路流判定
首先處理出每個人和門間的距離
二分時間,連邊時把每個門拆成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行每行表示乙個頂點座標,...