最小费用流

来源:互联网 发布:申请淘宝店铺多少钱 编辑:程序博客网 时间:2024/05/23 01:19
#include <cstdio>#include <cstring>#include <vector>#include <queue>using namespace std;typedef pair<int,int> P;const int MAX_V=100+5;const int INF=0x3fffffff;struct edge{    int to,cap,cost,rev;};int V;vector<edge> G[MAX_V];int h[MAX_V];int dist[MAX_V];int prevv[MAX_V],preve[MAX_V];void init(){    for(int i=0;i<MAX_V;i++)G[i].clear();}void add_edge(int from,int to,int cap,int cost){    G[from].push_back((edge){to,cap,cost,G[to].size()});    G[to].push_back((edge){from,0,-cost,G[from].size()-1});}int min_cost_flow(int s,int t,int f){    int res=0;    fill(h,h+V,0);    while(f>0){        priority_queue<P,vector<P>,greater<P> >pq;        fill(dist,dist+V,INF);                                  //this line may be modified according to the problem        dist[s]=0;        pq.push(P(0,s));        while(!pq.empty()){            P p=pq.top();pq.pop();            int v=p.second;            if(dist[v]<p.first)continue;            for(int i=0;i<G[v].size();i++){                edge &e=G[v][i];                if(e.cap>0 && dist[e.to]>dist[v]+e.cost+h[v]-h[e.to]){                    dist[e.to]=dist[v]+e.cost+h[v]-h[e.to];                    prevv[e.to]=v;                    preve[e.to]=i;                    pq.push(P(dist[e.to],e.to));                }            }        }        if(dist[t]==INF){            return -1;        }        for(int v=0;v<V;v++)h[v]+=dist[v];                      //this line may be modified according to the problem        int d=f;        for(int v=t;v!=s;v=prevv[v]){            d=min(d,G[prevv[v]][preve[v]].cap);        }        f-=d;        res+=d*h[t];        for(int v=t;v!=s;v=prevv[v]){            edge &e=G[prevv[v]][preve[v]];            e.cap-=d;            G[v][e.rev].cap+=d;        }    }    return res;}