zoukankan      html  css  js  c++  java
  • UVA

    最短路对应费用,路径数量对应流量。为限制点经过次数,拆点为边。跑一次流量为2的最小费用最大流。

    最小费用最大流和最大流EK算法是十分相似的,只是把找增广路的部分换成了求费用的最短路。

     

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    
    const int maxv = 2000+5;
    const int maxe = 22000+5;
    
    struct Edge
    {
        int v,cap,cost,nxt;
        void IN(int V,int C,int c,int N)
        {
            v = V; cap = C; cost = c; nxt = N;
        }
    }edges[maxe];
    
    
    int head[maxv],ecnt,vcnt;
    
    
    void AddEdge(int u,int v,int C,int c)
    {
        edges[ecnt].IN(v,C,c,head[u]);
        head[u] = ecnt++;
        edges[ecnt].IN(u,0,-c,head[v]);
        head[v] = ecnt++;
    }
    const int INF = 0x3f3f3f3f;
    int S,T;
    bool vis[maxv];
    int d[maxv],p[maxv],a[maxv];
    bool spfa()
    {
        memset(d,0x3f,sizeof(int)*vcnt);
        memset(vis,0,sizeof(bool)*vcnt);
    
        queue<int> q; q.push(S); d[S] = 0;
        a[S] = INF;
        while(q.size()){
            int u = q.front(); q.pop();
            vis[u] = false;
            for(int i = head[u]; ~i; i = edges[i].nxt){
                Edge &e = edges[i];
                if(e.cap&& d[e.v] > d[u]+e.cost){
                    d[e.v] = d[u] + e.cost;
                    p[e.v] = i;
                    a[e.v] = min(a[u],e.cap);
                    if(!vis[e.v]) { q.push(e.v); vis[e.v] = true; }
                }
            }
        }
        return d[T] != INF;
    }
    
    ll MinCostMaxFlow()
    {
        ll cost = 0;
        while(spfa()){
            cost += d[T];
            for(int i = T; i != S; i = edges[p[i]^1].v){
                edges[p[i]].cap -= a[T];
                edges[p[i]^1].cap += a[T];
            }
        }
        return cost;
    }
    
    int pin[maxv],pout[maxv];
    
    
    
    int main()
    {
        //freopen("in.txt","r",stdin);
        int v,e;
        int S = 0; T = 1;
        while(~scanf("%d%d",&v,&e)){
    
            vcnt = 2; ecnt = 0;
            pin[1] = pout[1] = vcnt++;
            pin[v] = pout[v] = vcnt++;
            for(int i = 2; i < v; i++) {
                pin[i] = vcnt++;
                pout[i] = vcnt++;
            }
            memset(head,-1,sizeof(int)*(vcnt));
            AddEdge(S,pin[1],2,0);
            AddEdge(pout[v],T,2,0);
            for(int i = 2; i < v; i++) AddEdge(pin[i],pout[i],1,0);
            while(e--){
                int u,v,c; scanf("%d%d%d",&u,&v,&c);
                AddEdge(pout[u],pin[v],1,c);
            }
            printf("%lld
    ",MinCostMaxFlow());
        }
        return 0;
    }
  • 相关阅读:
    Activity(活动)生命周期(1)--返回栈
    探究Activity(1)--Activity的基本用法
    Z-Stack协议栈网络号与信道号的设置
    如何搭建自己的网站到远程服务器(亲测有效)
    新手搭建springmvc+mybits框架的经验分享
    spring+mybits 整合所需jar包的下载路径(亲测有效)
    Map集合的四种常用遍历方式整理
    java设计模式----单例模式
    浅谈H5技术
    jsp内置对象分析
  • 原文地址:https://www.cnblogs.com/jerryRey/p/4760484.html
Copyright © 2011-2022 走看看