zoukankan      html  css  js  c++  java
  • BZOJ4930: 棋盘

    BZOJ4930: 棋盘

    https://lydsy.com/JudgeOnline/problem.php?id=4930

    分析:

    • 基本上就是游戏那道题加上费用流了,所以没啥好说的。
    • 记得两边都是拆边。

    代码:

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cstdlib>
    #include <cmath>
    using namespace std;
    #define inf 0x3f3f3f3f
    #define N 2550
    #define M 500050
    typedef double f2;
    namespace EK {
    	const int S=N-1,T=N-2;
    	int head[N],to[M],nxt[M],flow[M],val[M],cnt=1;
    	int dis[N],Q[N],path[N],vis[N];
    	inline void add(int u,int v,int f,int c) {
    		to[++cnt]=v; nxt[cnt]=head[u]; head[u]=cnt; flow[cnt]=f; val[cnt]=c;
    		to[++cnt]=u; nxt[cnt]=head[v]; head[v]=cnt; flow[cnt]=0; val[cnt]=-c;
    	}
    	bool spfa() {
    		memset(path,0,sizeof(path));
    		memset(dis,0x3f,sizeof(dis));
    		int l=0,r=0;
    		Q[r++]=S; dis[S]=0;
    		while(l!=r) {
    			int x=Q[l++]; if(l==S) l=0;
    			int i; vis[x]=0;
    			for(i=head[x];i;i=nxt[i]) if(dis[to[i]]>dis[x]+val[i]&&flow[i]) {
    				dis[to[i]]=dis[x]+val[i]; path[to[i]]=i^1;
    				if(!vis[to[i]]) {
    					vis[to[i]]=1; Q[r++]=to[i]; if(r==S) r=0;
    				}
    			}
    		}
    		return path[T]!=0;
    	}
    	pair<int,int> ek() {
    		int minc=0,maxf=0;
    		while(spfa()) {
    			int nf=inf;
    			int i;
    			for(i=T;i!=S;i=to[path[i]]) {
    				nf=min(nf,flow[path[i]^1]);
    			}maxf+=nf;
    			for(i=T;i!=S;i=to[path[i]]) {
    				flow[path[i]^1]-=nf;
    				flow[path[i]]+=nf;
    				minc+=nf*val[path[i]^1];
    			}
    		}
    		return make_pair(minc,maxf);
    	}
    }
    int n,bl[2][55][55],m,ans[2550];
    char mp[55][55];
    int main() {
    	using namespace EK;
    	scanf("%d",&n);
    	int i,j,k;
    	for(i=1;i<=n;i++) scanf("%s",mp[i]+1);
    	for(i=1;i<=n;i++) {
    		for(j=1;j<=n;j++) {
    			if(mp[i][j]=='#') {continue;}
    			int st=j;
    			for(;j<n&&mp[i][j+1]=='.';j++) ;
    			m++;
    			for(k=st;k<=j;k++) bl[0][i][k]=m;
    			for(k=1;k<=n;k++) add(S,m,1,k-1);
    		}
    	}
    	for(j=1;j<=n;j++) {
    		for(i=1;i<=n;i++) {
    			if(mp[i][j]=='#') {continue;}
    			int st=i;
    			for(;i<n&&mp[i+1][j]=='.';i++) ;
    			m++;
    			for(k=st;k<=i;k++) bl[1][k][j]=m;
    			for(k=1;k<=n;k++) {
    				add(m,T,1,k-1);
    			}
    		}
    	}
    	for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(mp[i][j]=='.') {
    		add(bl[0][i][j],bl[1][i][j],1,0);
    	}
    	int now=1;
    	int minc=0;
    	while(spfa()) {
    		int nf=inf;
    		int i;
    		for(i=T;i!=S;i=to[path[i]]) {
    			nf=min(nf,flow[path[i]^1]);
    		}
    		for(i=T;i!=S;i=to[path[i]]) {
    			flow[path[i]^1]-=nf;
    			flow[path[i]]+=nf;
    			minc+=nf*val[path[i]^1];
    		}
    		ans[now]=minc; now+=1;
    	}
    	int q;
    	scanf("%d",&q);
    	while(q--) {
    		scanf("%d",&k);
    		printf("%d
    ",ans[k]);
    	}
    }
    
  • 相关阅读:
    强制退出 避免程序在关闭时崩溃
    ShadowMap渲染阴影方法及问题 【转】
    模板缓冲与阴影体 【转】
    Shadow Mapping 的原理与实践 【转】
    Shadow Map阴影贴图技术之探 【转】
    OpenGL超级宝典笔记——深度纹理和阴影 【转】
    基于GPU加速的三维空间分析【转】
    Linux Shell 高级变量及字符串
    cpu使用率低负载高,原因分析
    zabbix web monitoring 监控网页
  • 原文地址:https://www.cnblogs.com/suika/p/10205913.html
Copyright © 2011-2022 走看看