BZOJ2150 部落戰爭 帶上下界最小流

2022-02-27 09:02:27 字數 1429 閱讀 8959

bzoj2150

複習:帶上下界網路流兩種寫法:

不建\(t->s\)的\(inf\)的邊,即不考慮源匯點,先求出此時超級源匯的最大流,即無源匯下最大的自我調整,再加入該邊,求超級源匯最大流增加的流量

先求出【或觀察出】\(s->t\)的最大流,記為\(tot\),然後撤銷流量,再建立\(t->s\),求出超級源匯最大流\(f\),答案為\(tot - f\)

兩者本質一樣,但後者在\(s->t\)最大流確定的情況下,可以增加效率

#include#include#include#include#include#include#include#include#include#define ll long long int

#define rep(i,n) for (int i = 1; i <= (n); i++)

#define redge(u) for (int k = h[u],to; k; k = ed[k].nxt)

#define cls(s,v) memset(s,v,sizeof(s))

#define mp(a,b) make_pair(a,b)

#define cp pairusing namespace std;

const int maxn = 5005,maxm = 3000005,inf = 0x3f3f3f3f;

inline int read()

while (c >= 48 && c <= 57)

return flag ? out : -out;

}char sq[55];

int x = ,y = ;

int n,m,r,c,id[55][55],tot;

int s,t,q[maxn],head,tail,cur[maxn];

int now,used[maxn],vis[maxn],d[maxn];

int h[maxn],ne = 1;

struct edgeed[maxm];

inline void build(int u,int v,int f); h[u] = ne;

ed[++ne] = (edge); h[v] = ne;

}bool bfs(int s,int t)

}return false;

}int dfs(int u,int minf,int t)

return flow;

}int main()

s = (tot << 1) + 1; t = s + 1;

rep(i,n) rep(j,m)

if (r != c)

} }int ans = tot;

while (bfs(s,t)) ans -= dfs(s,inf,t);

printf("%d\n",ans);

return 0;

}

bzoj2150 部落戰爭

lanzerb的部落在a國的上部,他們不滿天寒地凍的環境,於是準備向a國的下部征戰來獲得更大的領土。a國是乙個m n的矩陣,其中某些地方是城鎮,某些地方是高山深澗無人居住。lanzerb把自己的部落分成若干支軍隊,他們約定 1.每支軍隊可以從任意乙個城鎮出發,並只能從上往向下征戰,不能回頭。途中只能...

BZOJ2150 部落戰爭

bzoj2150 部落戰爭 lanzerb的部落在a國的上部,他們不滿天寒地凍的環境,於是準備向a國的下部征戰來獲得更大的領土。a國是一 個m n的矩陣,其中某些地方是城鎮,某些地方是高山深澗無人居住。lanzerb把自己的部落分成若干支軍隊,他們 約定 1.每支軍隊可以從任意乙個城鎮出發,並只能從...

bzoj2150 部落戰爭

補了一下匈牙利的各種騷操作。最大匹配等於最小覆蓋 最大獨立集 n 最小覆蓋 最大團 補圖的最大獨立集 對於這題,把每個點拆成兩個,可以到達的就連邊。我匈牙利的模版是真不熟。include include include include include include using namespace ...