【bzoj 1458】士兵占领
2018-01-10 12:06
295 查看
传送门~
源点向每一行连边,每一列向汇点连边。矩阵中每一个点如果不是障碍物就从那一行向那一列连一条流量为1的边。
代码:
解题思路
建图:先在棋盘上摆满士兵,求最多拿走多少士兵仍能满足条件,就可以跑最大流了。源点向每一行连边,每一列向汇点连边。矩阵中每一个点如果不是障碍物就从那一行向那一列连一条流量为1的边。
代码:
#include<algorithm> #include<iostream> #include<cmath> #include<cstring> #include<string> #include<cstdio> #include<cstdlib> #include<queue> using namespace std; int hed[205],nex[40005],lb[40005],cap[40005]; int L[105],C[105],suml[105],sumc[105]; int dep[205],pa[105][105]; int n,m,pk,s=201,t=202,lo=-1,mx=2147483640; int dfs(int x,int num){ if(num==0 || x==t) return num; int c=0; for(int i=hed[x];i!=-1;i=nex[i]) if(cap[i] && dep[lb[i]]==dep[x]+1){ int f=dfs(lb[i],min(num,cap[i])); c+=f; num-=f; cap[i]-=f; cap[i^1]+=f; if(num==0) break; } return c; } bool bfs(){ memset(dep,0,sizeof(dep)); queue<int>q; q.push(s); dep[s]=1; while(!q.empty()){ int x=q.front();q.pop(); for(int i=hed[x];i!=-1;i=nex[i]) if(cap[i] && !dep[lb[i]]){ dep[lb[i]]=dep[x]+1; q.push(lb[i]); } } return dep[t]; } int dinic_(){ int c=0; while(bfs()) c+=dfs(s,mx); return c; } void add(int x,int y,int num){ lo++; nex[lo]=hed[x]; hed[x]=lo; lb[lo]=y; cap[lo]=num; } int main(){ int xx,yy; memset(hed,-1,sizeof(hed)); scanf("%d%d%d",&n,&m,&pk); for(int i=1;i<=n;i++) {scanf("%d",&L[i]);suml[i]=m;} for(int i=1;i<=m;i++) {scanf("%d",&C[i]);sumc[i]=n;} for(int i=1;i<=pk;i++){ scanf("%d%d",&xx,&yy); pa[xx][yy]=1; suml[xx]--; sumc[yy]--; } for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(!pa[i][j]){ add(i,n+j,1); add(n+j,i,0); } for(int i=1;i<=n;i++) {add(s,i,suml[i]-L[i]);add(i,s,0);} for(int i=1;i<=m;i++) {add(i+n,t,sumc[i]-C[i]);add(t,i+n,0);} printf("%d",n*m-pk-dinic_()); return 0; }
相关文章推荐
- [最大流] BZOJ 1458: 士兵占领 题解
- bzoj1458 士兵占领 最大流
- 【网络流 最大流】【bzoj1458】士兵占领
- 1458: 士兵占领 - BZOJ
- bzoj1458 士兵占领
- BZOJ1458 士兵占领
- BZOJ 1458 士兵占领
- bzoj 1458 士兵占领(最大流)
- BZOJ1458: 士兵占领 最大流
- bzoj1458 士兵占领
- BZOJ1458 士兵占领 【带上下界网络流】
- BZOJ1458: 士兵占领
- [BZOJ 1458] 士兵占领
- BZOJ 1458: 士兵占领 最大流
- 【bzoj1458】【士兵占领】【网络流】
- 【BZOJ-1458】士兵占领 最大流
- 【bzoj 1458】士兵占领(最大流)
- 【BZOJ】1458: 士兵占领(上下界网络流)
- BZOJ 1458: 士兵占领( 网络流 )
- BZOJ1458 士兵占领