zoukankan      html  css  js  c++  java
  • 【LOJ #6068】「2017 山东一轮集训 Day4」棋盘(费用流)

    传送门

    将行列分别看做点
    如果被障碍分成几段的话就再建几个点
    行列向每段的点连(cap=1,cost=0),(1,1),(1,2)....(cap=1,cost=0),(1,1),(1,2)....的边

    答案即最小费用

    每次都跑一边过不去
    按询问的流量排序后增量做

    #include<bits/stdc++.h>
    using namespace std;
    #define cs const
    #define re register
    #define pb push_back
    #define pii pair<int,int>
    #define ll long long
    #define fi first
    #define se second
    #define bg begin
    cs int RLEN=1<<20|1;
    inline char gc(){
        static char ibuf[RLEN],*ib,*ob;
        (ib==ob)&&(ob=(ib=ibuf)+fread(ibuf,1,RLEN,stdin));
        return (ib==ob)?EOF:*ib++;
    }
    inline int read(){
        char ch=gc();
        int res=0;bool f=1;
        while(!isdigit(ch))f^=ch=='-',ch=gc();
        while(isdigit(ch))res=(res+(res<<2)<<1)+(ch^48),ch=gc();
        return f?res:-res;
    }
    inline void readstring(char *s){
    	int top=0;char ch=gc();
    	while(isspace(ch))ch=gc();
    	while(!isspace(ch)&&ch!=EOF)s[++top]=ch,ch=gc();
    }
    template<class tp>inline void chemx(tp &a,tp b){a<b?a=b:0;}
    template<class tp>inline void chemn(tp &a,tp b){a>b?a=b:0;}
    cs int N=3005,M=55;
    int n,tot,str,des;
    namespace flow{
    	struct edge{
    		int v,cap,val,r,kd;
    		edge(int a=0,int b=0,int d=0,int e=0,int f=0):v(a),cap(b),val(d),r(e),kd(f){}
    	};
    	vector<edge> e[N];
    	typedef vector<edge>::iterator It;
    	It tp[N];
    	int dis[N],vis[N],mncost,mxflow;
    	queue<int> q;
    	inline void addedge(int u,int v,int w,int cap){
    		e[u].pb(edge(v,cap,w,e[v].size(),1));
    		e[v].pb(edge(u,0,-w,e[u].size()-1,0));
    	}
    	inline void reset(){
    		for(int u=0;u<=tot;u++){
    			for(edge &x:e[u]){
    				if(x.kd==1)
    				x.cap+=e[x.v][x.r].cap,e[x.v][x.r].cap=0;
    			}
    		}
    		mxflow=mncost=0;
    	}
    	inline bool spfa(){
    		memset(dis,127/3,sizeof(int)*(tot+1));
    		memset(vis,0,sizeof(int)*(tot+1));
    		dis[str]=0,vis[str]=1,q.push(str);
    		while(!q.empty()){
    			int u=q.front();q.pop();vis[u]=0;
    			for(edge &x:e[u])if(dis[x.v]>dis[u]+x.val&&x.cap>0){
    				dis[x.v]=dis[u]+x.val;
    				if(!vis[x.v])vis[x.v]=1,q.push(x.v);
    			}
    		}
    		return dis[des]!=dis[0];
    	}
    	inline int dfs(int u,int flow){
    		if(u==des)return flow;
    		vis[u]=1;
    		int res=0;
    		for(It &it=tp[u];it!=e[u].end();it++){
    			if(!vis[it->v]&&dis[it->v]==dis[u]+it->val&&it->cap>0){
    				int now=dfs(it->v,min(flow-res,it->cap));
    				it->cap-=now,res+=now,e[it->v][it->r].cap+=now,mncost+=it->val*now;
    				if(res==flow)break;
    			}
    		}
    		return res;
    	}
    	inline void mcmf(){
    		while(spfa()){
    			for(int i=0;i<=tot;i++)tp[i]=e[i].begin();
    			mxflow+=dfs(str,1e9);
    		}
    	}
    }
    char s[M][M];
    int st[M],cnt;
    int lk[M][M],ans[10005];
    pii qt[10005];
    int main(){
    	#ifdef Stargazer
    	freopen("lx.in","r",stdin);
    	#endif
    	n=read();tot=2*n;
    	for(int i=1;i<=n;i++)readstring(s[i]);
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=n+1;j++){
    			if(s[i][j]=='.')st[++cnt]=j;
    			else{
    				if(cnt){
    					int u=++tot;
    					for(int t=0;t<cnt;t++)flow::addedge(i,u,t,1);
    					for(int t=1;t<=cnt;t++)lk[i][st[t]]=u;
    					cnt=0;
    				}
    			}
    		}
    	}
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=n+1;j++){
    			if(s[j][i]=='.')st[++cnt]=j;
    			else{
    				if(cnt){
    					int u=++tot;
    					for(int t=0;t<cnt;t++)flow::addedge(u,i+n,t,1);
    					for(int t=1;t<=cnt;t++)flow::addedge(lk[st[t]][i],u,0,1);
    					cnt=0;
    				}
    			}
    		}
    	}
    	for(int i=1;i<=n;i++)flow::addedge(i+n,tot+1,0,n);
    	des=++tot;
    	for(int i=1;i<=n;i++)flow::addedge(tot+1,i,0,n);
    	tot+=2,str=tot;
    	int q=read();
    	for(int i=1;i<=q;i++)qt[i]=pii(read(),i);
    	sort(qt+1,qt+q+1);
    	for(int i=1;i<=q;i++){
    		flow::addedge(tot,tot-1,0,qt[i].fi-qt[i-1].fi);
    		flow::mcmf();
    		ans[qt[i].se]=flow::mncost;
    	}
    	for(int i=1;i<=q;i++)cout<<ans[i]<<'
    ';
    }
    
  • 相关阅读:
    [js高手之路] es6系列教程
    [js高手之路] es6系列教程
    [js高手之路] es6系列教程
    [js高手之路]Node.js+jade+mongoose实战todolist(分页,ajax编辑,删除)
    [js高手之路]Node.js+jade+express+mongodb+mongoose+promise实现todolist
    [js高手之路]Node.js+jade+mongodb+mongoose实现爬虫分离入库与生成静态文件
    [js高手之路]Node.js+jade抓取博客所有文章生成静态html文件
    [js高手之路]Node.js模板引擎教程-jade速学与实战4-模板引用,继承,插件使用
    [js高手之路]Node.js模板引擎教程-jade速学与实战3-mixin
    [js高手之路]Node.js模板引擎教程-jade速学与实战2-流程控制,转义与非转义
  • 原文地址:https://www.cnblogs.com/stargazer-cyk/p/12328302.html
Copyright © 2011-2022 走看看