• BZOJ 3894 文理分科


    题解:最小割建模

    如果某些元素在一起会得到收益考虑最小割

    答案 总收益-最小割

    注意:对0点的处理

    一开始模型是错的

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<vector>
    #include<queue>
    #include<cassert>
    #include<algorithm>
    using namespace std;
    const int maxn=100000;
    const int oo=1000000000;
    
    int n,m; 
    int ans=0;
    int totn=0;
    int p[200][200];
    
    struct Edge{
    	int from,to,cap,flow;
    	Edge(){
    		from=to=cap=flow=0;
    	}
    };
    vector<int>G[maxn];
    vector<Edge>edges;
    void Addedge(int x,int y,int z){
    	if((x==0)||(y==0))return; 
    	Edge e;
    	e.from=x;e.to=y;e.cap=z;e.flow=0;
    	edges.push_back(e);
    	e.from=y;e.to=x;e.cap=0;e.flow=0;
    	edges.push_back(e);
    	int c=edges.size();
    	G[x].push_back(c-2);
    	G[y].push_back(c-1);
    }
    
    int s,t;
    queue<int>q;
    int vis[maxn];
    int d[maxn];
    int Bfs(){
    	memset(vis,0,sizeof(vis));
    	vis[s]=1;d[s]=0;q.push(s);
    	while(!q.empty()){
    		int x=q.front();q.pop();
    		for(int i=0;i<G[x].size();++i){
    			Edge e=edges[G[x][i]];
    			if((!vis[e.to])&&(e.cap>e.flow)){
    				vis[e.to]=1;
    				d[e.to]=d[x]+1;
    				q.push(e.to);
    			}
    		}
    	}
    	return vis[t];
    }
    
    int Dfs(int x,int a){
    	if((x==t)||(a==0))return a;
    	
    	int nowflow=0,f=0;
    	for(int i=0;i<G[x].size();++i){
    		Edge e=edges[G[x][i]];
    		if((d[e.to]==d[x]+1)&&((f=Dfs(e.to,min(a,e.cap-e.flow)))>0)){
    			nowflow+=f;
    			a-=f;
    			edges[G[x][i]].flow+=f;
    			edges[G[x][i]^1].flow-=f;
    			if(a==0)break;
    		}
    	}
    	return nowflow;
    }
    
    int Maxflow(){
    	int flow=0;
    	while(Bfs())flow+=Dfs(s,oo);
    	return flow;
    }
    
    
    //s->Ñ¡ÎÄ
    //t->Ñ¡Àí
    //hashmapÅжϱßÊÇ·ñ´æÔÚ 
    int main(){
    	scanf("%d%d",&n,&m);
    	
    	s=n*m+1;t=n*m+2;totn=t;
    	for(int i=1;i<=n;++i){
    		for(int j=1;j<=m;++j){
    			p[i][j]=(i-1)*m+j;
    		}
    	}
    	for(int i=1;i<=n;++i){
    		for(int j=1;j<=m;++j){
    			int x;scanf("%d",&x);
    			ans+=x;
    			Addedge(s,p[i][j],x);
    		}
    	}
    	for(int i=1;i<=n;++i){
    		for(int j=1;j<=m;++j){
    			int x;scanf("%d",&x);
    			ans+=x;
    			Addedge(p[i][j],t,x);
    		}
    	}
    	for(int i=1;i<=n;++i){
    		for(int j=1;j<=m;++j){
    			int x;scanf("%d",&x);
    			ans+=x;
    			++totn;
    			Addedge(s,totn,x);
    			Addedge(totn,p[i][j],oo);
    			Addedge(totn,p[i][j-1],oo);
    			Addedge(totn,p[i][j+1],oo);
    			Addedge(totn,p[i-1][j],oo);
    			Addedge(totn,p[i+1][j],oo);
    		}
    	}
    	for(int i=1;i<=n;++i){
    		for(int j=1;j<=m;++j){
    			int x;scanf("%d",&x);
    			ans+=x;
    			++totn;
    			Addedge(totn,t,x);
    			Addedge(p[i][j],totn,oo);
    			Addedge(p[i][j-1],totn,oo);
    			Addedge(p[i][j+1],totn,oo);
    			Addedge(p[i-1][j],totn,oo);
    			Addedge(p[i+1][j],totn,oo);
    		}
    	}
    	
    	printf("%d
    ",ans-Maxflow());
    	return 0;
    }
    

      

    自己还是太辣鸡了
  • 相关阅读:
    Google Authentication 机制原理
    ldap日志
    ldap + kerberos 整合
    kerberos
    U盘格式化后的恢复
    初始化脚本(Os_Init_Optimization.sh)
    拿到新机器,进行初始化和部署Nginx的过程
    python 列表生成式
    python 装饰器
    简单总结无线CPE、无线AP、无线网桥的不同之处【转】
  • 原文地址:https://www.cnblogs.com/zzyer/p/8485854.html
Copyright © 2020-2023  润新知