[动态网络 网络流] LOJ#6068.「2017 山东一轮集训 Day4」棋盘
来源:互联网 发布:aria2c mac 编辑:程序博客网 时间:2024/06/06 03:17
这种棋盘模型很像网络流
但是边很难建。
可以动态加边,每次跑完一边费用流,把流过的边重新建一条,加上费用就好了
#include <cstdio>#include <iostream>#include <algorithm>#include <queue>using namespace std;const int N=10010;int n,q,nx,ny,S,T,cnt=1,lst,G[N],ans[N],vis[N];int l[55][55],r[55][55];char a[55][55];struct edge{ int t,nx,f,w;}E[N<<1];inline void addedge(int x,int y,int f,int w){ E[++cnt].t=y; E[cnt].nx=G[x]; E[cnt].f=f; E[cnt].w=w; G[x]=cnt; E[++cnt].t=x; E[cnt].nx=G[y]; E[cnt].f=0; E[cnt].w=-w; G[y]=cnt;}queue<int> Q;int frm[N],dis[N],chs[N];inline void spfa(){ for(int i=0;i<=T;i++) dis[i]=1<<30,vis[i]=0; vis[S]=1; dis[S]=0; Q.push(S); while(!Q.empty()){ int x=Q.front(); Q.pop(); vis[x]=0; for(int i=G[x];i;i=E[i].nx) if(E[i].f && dis[E[i].t]>dis[x]+E[i].w){ dis[E[i].t]=dis[x]+E[i].w; frm[E[i].t]=i; if(!vis[E[i].t]) Q.push(E[i].t),vis[E[i].t]=1; } } int mf=1<<30; for(int i=T;i;i=E[frm[i]^1].t) mf=min(mf,E[frm[i]].f); ++lst; ans[lst]=ans[lst-1]+dis[T]*mf; for(int i=T;i;i=E[frm[i]^1].t){ E[frm[i]].f-=mf; E[frm[i]^1].f+=mf; if(i==T) continue; chs[i]++; if(i<=nx) addedge(S,i,1,chs[i]); else addedge(i,T,1,chs[i]); }}int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%s",a[i]+1); for(int j=1;j<=n;j++){ l[i][j]=l[i][j-1]; if(a[i][j]=='.' && a[i][j-1]!='.') l[i][j]=++nx; } } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ r[j][i]=r[j-1][i]; if(a[j][i]=='.' && a[j-1][i]!='.') r[j][i]=++ny; } } S=0; T=nx+ny+1; for(int i=1;i<=nx;i++) addedge(S,i,1,0); for(int i=1;i<=ny;i++) addedge(nx+i,T,1,0); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(a[i][j]=='.') addedge(l[i][j],nx+r[i][j],1,0); scanf("%d",&q); while(q--){ int x; scanf("%d",&x); while(lst<x) spfa(); printf("%d\n",ans[x]); } return 0;}
阅读全文
0 0
- [动态网络 网络流] LOJ#6068.「2017 山东一轮集训 Day4」棋盘
- [分块 回文自动机] LOJ#6070. 「2017 山东一轮集训 Day4」基因
- [费用流]LOJ#6079. 「2017 山东一轮集训 Day7」养猫
- LOJ #6077. 「2017 山东一轮集训 Day7」逆序对
- LOJ #6077. 「2017 山东一轮集训 Day7」逆序对
- [霍尔定理]「2017 山东一轮集训 Day2」LOJ 6062——PAIR
- [倍增NTT][DP] LOJ#6059. 「2017 山东一轮集训 Day1」Sum
- [最短路 杂题] LOJ#6075. 「2017 山东一轮集训 Day6」重建
- [莫队维护DP] LOJ#6074. 「2017 山东一轮集训 Day6」子序列
- [后缀自动机 DP] LOJ#6071. 「2017 山东一轮集训 Day5」字符串
- [容斥 DP] LOJ#6077. 「2017 山东一轮集训 Day7」逆序对
- loj #6062. 「2017 山东一轮集训 Day2」Pair(线段树)
- [LOJ#6060][线性基]2017 山东一轮集训 Day1. Set
- [DP][倍增NTT]LOJ#6059. 2017 山东一轮集训 Day1. Sum
- [线段树][二分图 霍尔定理]LOJ#6062 && 2017 山东一轮集训 Day2. Pair
- [计数][容斥] LOJ#6065 || BZOJ4927 && 2017 山东一轮集训 Day3. 第一题
- [树的同构][二分][可并堆维护哈希] LOJ#6066 || BZOJ4928 && 2017 山东一轮集训 Day3. 第二题
- LOJ 6100 「2017 山东二轮集训 Day1」第一题
- Zookeeper集群配置
- OpenCV
- java服务器使用swagger自动生成API文档
- Android px,dip,sp之间的转换
- 关于ionic制作webApp打包的过程
- [动态网络 网络流] LOJ#6068.「2017 山东一轮集训 Day4」棋盘
- __attribute__ 机制
- iOS实现文字环绕图片textView布局
- Fragment的OnResume()方法不执行原因及解决办法
- mysql常用命令
- 好用的studio插件
- 阿里云Tech Insight MVP Demo Show精彩呈现!
- 前端资源网站
- oracle数据库获取表的列名以及列名的注释,并按表中字段原来的顺序显示