給定乙個\(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的棋盤,有的格仔是障礙。現在你要選擇一些格仔來放置一些士兵,乙個格仔裡最多可以放置乙個士兵,障礙格里不能放置士兵。我們稱這些士...