• 初学网络流——最小费用流(白书模板,dij)


    求最终流量为 f 的最小费用,存在输出费用,不存在输出-1

    #include<bits/stdc++.h>
    
    using namespace std;
    
    typedef long long ll;
    typedef pair<int,int> PII;
    const int MAXN = 1e4+10;
    const int MAXM = 1e5+10;
    const double EPS = 1e-12;
    
    int n,m,s,t,f;
    int dis[MAXN],h[MAXN],p1[MAXN],p2[MAXN];
    struct node{
        int to,cap,cost,rev;
    };
    vector<node>G[MAXN];
    
    int min_cost_flow(){
        int ans=0;
        for(int i=1;i<=n;i++)h[i]=0;
        while(f>0){
            priority_queue<PII,vector<PII>,greater<PII> >q;
            for(int i=1;i<=n;i++)dis[i]=1e9;
            dis[s]=0;
            q.push(PII(0,s));
            while(!q.empty()){
                PII p=q.top();q.pop();
                int v=p.second;
                if(dis[v]<p.first)continue;
                for(int i=0;i<G[v].size();i++){
                    node &e=G[v][i];
                    if(e.cap>0&&dis[e.to]>dis[v]+e.cost+h[v]-h[e.to]);{
                        dis[e.to]=dis[v]+e.cost+h[v]-h[e.to];
                        p1[e.to]=v;
                        p2[e.to]=i;
                        q.push(PII(dis[e.to],e.to));
                    }
                }
            }
            if(dis[t]==1e9)return -1;
            for(int i=1;i<=n;i++)h[i]+=dis[i];
            int d=f;
            for(int i=t;i!=s;i=p1[i])
                d=min(d,G[p1[i]][p2[i]].cap);
            f-=d;
            ans+=d*h[t];
            for(int i=t;i!=s;i=p1[i]){
                node &e=G[p1[i]][p2[i]];
                e.cap-=d;
                G[i][e.rev].cap+=d;
            }
        }
        return ans;
    }
    
    int main()
    {
        scanf("%d %d %d %d",&n,&m,&s,&t,&f);
        int u,v,w,cost;
        for(int i=1;i<=m;i++){
            scanf("%d %d %d",&u,&v,&w,&cost);
            G[u].push_back(node{v,w,cost,G[v].size()});
            G[v].push_back(node{u,0,-cost,G[u].size()-1});
        }
        printf("%d",min_cost_flow());
    }
    
    
  • 相关阅读:
    git如何忽略文件或者文件夹
    jsonp跨域请求发布出去
    PHP
    curl保存图片
    curl 请求
    输入框纯数字
    PHP允许AJAX跨域请求的两种方法
    IOS开发笔记 IOS如何访问通讯录
    Android 蓝牙开发(整理大全)
    新的移动服务示例
  • 原文地址:https://www.cnblogs.com/Mmasker/p/11917456.html
Copyright © 2020-2023  润新知