【最小费用流】

来源:互联网 发布:js object 键 值 编辑:程序博客网 时间:2024/06/05 09:46


一、有时间再完善

const int INF=0x3f3f3f3f;const int MAXN=66;struct edge{    int to,cap,cost,rev;    edge(int x,int y,int z,int w)    {        to=x;cost=y;cap=z;rev=w;    }};vector<edge> g[MAXN];int prei[MAXN],prej[MAXN],dist[MAXN],n2;void add(int from,int to,int cost,int cap){    g[from].push_back(edge(to,cost,cap,g[to].size()));    g[to].push_back(edge(from,-cost,0,g[from].size()-1));}int min_cost_flow(int s,int t,int f){    int res=0;    while(f>0)    {        for(int i=0;i<=n2;i++)            dist[i]=INF;        dist[s]=0;        bool update=true;        while(update)        {            update=false;            for(int i=0;i<=n2;i++)            {                if(dist[i]==INF)continue;                for(int j=0;j<g[i].size();j++)                {                    edge &e=g[i][j];                    if(e.cap>0&&dist[e.to]>dist[i]+e.cost)                    {                        dist[e.to]=dist[i]+e.cost;                        prei[e.to]=i;                        prej[e.to]=j;                        update=true;                    }                }            }        }           if(dist[t]==INF)return -1;            int d=f;            for(int i=t;i!=s;i=prei[i])            {                d=min(d,g[prei[i]][prej[i]].cap);            }            f-=d;            res+=d*dist[t];            for(int i=t;i!=s;i=prei[i])            {                edge &e=g[prei[i]][prej[i]];                e.cap-=d;                g[i][e.rev].cap+=d;            }    }    return res;}