zoukankan      html  css  js  c++  java
  • Acme Corporation UVA

    Code:

    #include<cstdio>
    #include<cstring>
    #include<vector>
    #include<queue>
    #include<algorithm>
    using namespace std;
    const int maxn=500;
    const int INF=10000000+23666;
    typedef long long ll;
    int s,t,n;
    struct Edge{
    	int from,to,cost;
    	ll cap;
    	Edge(int u,int v,ll c,int f):from(u),to(v),cap(c),cost(f){}
    };
    struct MCMF{
        vector<Edge>edges;
        vector<int>G[maxn];
        ll d[maxn],inq[maxn],a[maxn],flow2[maxn];
        queue<int>Q;
        ll ans=0;
        int flow=0;
        void init(){
        	   memset(a,0,sizeof(a));
        	   edges.clear();
        	   for(int i=0;i<maxn;++i)G[i].clear();
        	   ans=0,flow=0;
        }
        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]>=0)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 maxflow(){
            while(SPFA());
            return -ans;
        }
    }op;
    int main()
    {
    	int T;scanf("%d",&T);
    	for(int cas=1;cas<=T;++cas)
    	{
              op.init();int cnt=0;
    		int m,I;scanf("%d%d",&m,&I);
    		s=0,n=2*m+1,t=n;
    		for(int i=1;i<=m;++i){
    			cnt+=2;
    		     int mi,ni,pi,si,E;
    		     scanf("%d%d%d%d%d",&mi,&ni,&pi,&si,&E);
                   op.addedge(s,cnt,ni,mi);
                   op.addedge(cnt-1,t,si,-pi);
                   int a=cnt-1;
                   for(int j=0;j<=E&&a<t;++j){
                        op.addedge(cnt,a,INF,j*I);
                        a+=2;
                   }
              }
              printf("Case %d: %lld
    ",cas,op.maxflow());  
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    linux 短信收发
    sama5d3 环境检测 adc测试
    【Codeforces 723C】Polycarp at the Radio 贪心
    【Codeforces 723B】Text Document Analysis 模拟
    【USACO 2.2】Preface Numbering (找规律)
    【Codeforces 722C】Destroying Array (数据结构、set)
    【USACO 2.1】Hamming Codes
    【USACO 2.1】Healthy Holsteins
    【USACO 2.1】Sorting A Three-Valued Sequence
    【USACO 2.1】Ordered Fractions
  • 原文地址:https://www.cnblogs.com/guangheli/p/10367597.html
Copyright © 2011-2022 走看看