bzoj1458 士兵占領 最大流

2021-07-26 03:37:27 字數 767 閱讀 4263

又是反過來考慮。。。。。

直接計算會很複雜(畢竟每一行和每一列都會有一定的限制條件,很難同時滿足),那麼我們放過來思考,先把所有的各自都放上士兵一共n*m-k個,然後考慮拿走一部分士兵。

源點向每行建邊,邊權是:m-l[i]-這一行的障礙格仔數目,即是能夠拿走的士兵數目,然後列向匯點建邊,同理,每乙個格仔(可拿走)使得所在行和列連上邊權為1得邊,最後ans減去最大流就好了

//加了一句話快了8ms

#include#include#include#define maxn 20005

using namespace std;

int n,m,k,h[maxn],q[maxn],tot,head[maxn],top,l[maxn],c[maxn],ans;

int cn[maxn],cm[maxn],mat[102][102],s,t,last[maxn];

struct edgee[maxn];

void adde(int a,int b,int c)

void build()

bool bfs()

} }return h[t]!=-1;

}int dfs(int u,int f)

if(!used)h[u]=-1;

return used;

}void solve()

}int main()

build();

solve();

cout

}

BZOJ1458 士兵占領(最大流)

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

BZOJ1458 士兵占領 最大流

time limit 10 sec memory limit 64 mb submit 917 solved 515 submit status discuss 有乙個m n的棋盤,有的格仔是障礙。現在你要選擇一些格仔來放置一些士兵,乙個格仔裡最多可以放置乙個士兵,障礙格里不能放置士兵。我們稱這些士...

bzoj1458 士兵占領 最大流

time limit 10 sec memory limit 64 mb submit status discuss 有乙個m n的棋盤,有的格仔是障礙。現在你要選擇一些格仔來放置一些士兵,乙個格仔裡最多可以放置乙個士兵,障礙格里不能放置士兵。我們稱這些士兵占領了整個棋盤當滿足第i行至少放置了li個...