洛谷4311 士兵占領(最大流)

2021-09-10 06:17:29 字數 1048 閱讀 2878

又是一道魔性的網路流。。。。

考慮會導致「jiong!」的情況,無非就是當前這一行(列)需要的士兵個數《可放置士兵個數,所以在讀障礙的時候記一下影響的行和列,然後與每行每列最少需要的士兵進行比較即可。

然後考慮如何尋求答案。

很明顯,可以將問題轉化為最多可放士兵數-最多可不用士兵數,就可以得到最少使用士兵數。

每一行可不用的士兵數最多為l[i]-need1[i],這就是邊的容量,列同理。

得到的最大流就是最多可不用的士兵數了。

#includeusing namespace std;

const int maxn=210;

const int maxm=1e5+10;

const int inf=0x3f3f3f3f;

int n,m,cnt,s,t,k,sum;

int l[maxn],c[maxn];

int ne1[maxn],ne2[maxn];

int za[101][101];

int head[maxn],cur[maxn],depth[maxn];

int nxt[maxm],to[maxm],w[maxm];

int read()

void add(int x,int y,int z)

void add(int x,int y,int z)

int bfs()

} }return 0;

}int dfs(int u,int flow)

} }return res;

}int dinic()

return ret;

}int main()

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

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

add(s,i,ne1[i]-l[i]);

sum+=ne1[i];

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

add(i+n,t,ne2[i]-c[i]);

} cout

}

P4311 士兵占領 上下界費用流 or 最大流

有乙個m n的棋盤,有的格仔是障礙。現在你要選擇一些格仔來放置一些士兵,乙個格仔裡最多可以放置乙個士兵,障礙格里不能放置士兵。我們稱這些士兵占領了整個棋盤當滿足第i行至少放置了li個士兵,第j列至少放置了cj個士兵。現在你的任務是要求使用最少個數的士兵來占領整個棋盤。第一行兩個數m,n,k分別表示棋...

1458 士兵占領 思路題 最大流

t t我太弱了這個題都不會做。反向考慮 可以把最小問題轉化為最大問題 如果把格仔填滿,我們最多能拿走幾個?這樣做法就很顯然了。行列建圖就好了。qwq 有時候腦子需要拐個彎t t include include include define inf 1000000007 using namespace...

BZOJ1458 士兵占領(最大流)

傳送門 判斷joing 的條件是顯然的 如果行或列的總點數減去障礙數還不夠li或ci的話,肯定無解。我的建圖比較奇怪。三排點,分別為每一行,每個點,每一列。s 每一行,li 每一列 t,ci 每一行 當前行中的點,1 每個點 所在的列,1 注意這裡的點必須不是障礙點。最大流即為答案。貼上hzwer的...