zoukankan      html  css  js  c++  java
  • 洛谷P4014 分配问题 费用流

    Code:

    #include<vector>
    #include<algorithm>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    using namespace std;
    const int maxn=1003;
    const int INF=1000000+23666;
    typedef long long ll;
    int A[200][200];
    int s,t,n;
    int N;
    struct Edge{
    	int from,to,cap,cost;
    	Edge(int u,int v,int c,int f):from(u),to(v),cap(c),cost(f){}
    };
    struct MCMF{
    	vector<Edge>edges;
    	vector<int>G[maxn];
    	int d[maxn],inq[maxn],a[maxn],flow2[maxn];
    	queue<int>Q;
    	ll ans=0;
    	int flow=0;
    	void init(){
    		ans=0,flow=0;
    		for(int i=0;i<maxn;++i)G[i].clear();
    		for(int i=0;i<maxn;++i)edges.clear();
    	}
    	void addedge(int u,int v,int c,int f){
    		edges.push_back(Edge(u,v,c,f));    
    		edges.push_back(Edge(v,u,0,-f));   
    		int m=edges.size();
    		G[u].push_back(m-2);
    		G[v].push_back(m-1);
    	}
    	int SPFA(){
    		for(int i=0;i<=n;++i)d[i]=INF,flow2[i]=INF;
    		memset(inq,0,sizeof(inq));int f=INF;
    		d[s]=0,inq[s]=1;Q.push(s);
    		while(!Q.empty()){
    			int u=Q.front();Q.pop();inq[u]=0;
    			int sz=G[u].size();
    			for(int i=0;i<sz;++i){
    				  Edge e=edges[G[u][i]];
    				  if(e.cap>0&&d[e.to]>d[u]+e.cost){
    					  a[e.to]=G[u][i];
    					  d[e.to]=d[u]+e.cost;
    					  flow2[e.to]=min(flow2[u],e.cap);
    					  if(!inq[e.to]){inq[e.to]=1;Q.push(e.to);}
    				  }
    			}
    		}
    		if(d[t]==INF)return 0;
    		f=flow2[t];
    		flow+=f;
    		int u=edges[a[t]].from;
    		edges[a[t]].cap-=f;
    		edges[a[t]^1].cap+=f;
    		while(u!=s){
    			edges[a[u]].cap-=f;
    			edges[a[u]^1].cap+=f;
    			u=edges[a[u]].from;
    		}
    		ans+=(ll)(d[t]*f);
    		return 1;
    	}
    	ll  getcost(){
    		while(SPFA());
    		return ans;
    	}
    }op;
    void build(int mul){
    	op.init();
    	for(int i=1;i<=N;++i)
    		for(int j=1;j<=N;++j)
    		{
    			int a=j,b=i+N;
    			op.addedge(a,b,1,A[i][j]*mul);
    		}
    	for(int i=1;i<=N;++i)op.addedge(s,i,1,0);
    	for(int i=N+1;i<=N+N;++i)op.addedge(i,t,1,0);
    }
    int main(){
    	scanf("%d",&N);
    	for(int i=1;i<=N;++i)
    		for(int j=1;j<=N;++j)scanf("%d",&A[i][j]);
    	        s=0,t=N+N+1,n=N+N+1;
                build(1);
                printf("%lld
    ",op.getcost());
                build(-1);
                printf("%lld",op.getcost()*(-1));
                return 0;
    }
    

      

  • 相关阅读:
    sublime text 3 常用快捷键
    PHP注释-----PHPDOC
    正则表达式
    JavaScript中常用的函数
    网站特效离不开脚本,javascript是最常用的脚本语言,我们归纳一下常用的基础函数和语法:
    ubuntu16.04LTS下安装zookeeper
    HiveQL详解
    ubuntu16.04LTS下安装hive-2.1.0
    Hadoop环境 IDE配置(在eclipse中安装hadoop-eclipse-plugin-2.7.3.jar插件)
    Hadoop 数据节点DataNode异常
  • 原文地址:https://www.cnblogs.com/guangheli/p/10367596.html
Copyright © 2011-2022 走看看