BZOJ1458 士兵占領

2022-03-17 15:29:32 字數 1163 閱讀 1037

給定乙個\(n\times m\)的方格,其中有一些障礙格仔,限定每行每列分別至少要有的士兵數,問最少要擺多少個士兵。

最大流考慮在非障礙格仔都擺上乙個士兵,假如還是不夠數,那麼無解;

否則考慮哪些士兵可以去掉仍然滿足限制條件。

所以源點連「該行可以擺放的數量-限定最小值」的邊權到行的每個節點,同理,列的每個點連到匯點。

中間的連邊是非障礙格仔\(x\)連到\(y\),所以求出的最大流就是可以刪掉的最多士兵。

用總共非障礙數-最大流即為答案。

個人認為這個做法比**裡講的計算出最多貢獻為2的個數那種方法更好理解一些。

#include#include#includeusing namespace std;

const int maxn=110,maxm=20400,inf=0x7fffffff;

int n,m,k,s,t,a[maxn],b[maxn],tot,head[maxn<<1],dis[maxn<<1],cur[maxn<<1];

bool mp[maxn][maxn];

struct node

edge[maxm];

queueq;

int read()

void add(int u,int v,int w)

; head[u]=tot;

}#define link(u,v,w) (add((u),(v),(w)),add((v),(u),(0)))

int dfs(int u,int flow)

} return flow-res;

}bool bfs()

} }return dis[t];

}int dinic()

return ans;

}int main()

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

link(s,i,a[i]);

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

link(i+n,t,b[i]);

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

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

if (!mp[i][j])

link(i,j+n,1);

printf("%d\n",n*m-k-dinic());

return 0;

}

BZOJ 1458 士兵占領

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

bzoj 1458 士兵占領

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

bzoj1458 士兵占領

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