• 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;
    }
    

      

  • 相关阅读:
    MVC 数据库增删改查(2) 视图
    MVC 数据库增删改查(1)
    委托的4种写法
    wpf 多线程操作(2)
    wpf 多线程操作例(1)
    网络抓取邮箱
    wpf 点击新建弹出新的窗口
    wpf 数据绑定 联系
    wpf 在listview里添加数据
    面向对象:抽象基类,接口
  • 原文地址:https://www.cnblogs.com/guangheli/p/10367597.html
Copyright © 2020-2023  润新知