zoukankan      html  css  js  c++  java
  • 最小费用最大流模板

    spfa版费用流:

     1 //最小费用最大流spfa版,求最大费用只需要取相反数,结果取相反数即可。
     2 //点的编号0~n-1
     3 const int MAXN = 10000;
     4 const int MAXM = 100000;
     5 const int INF = 0x3f3f3f3f;
     6 struct Edge 
     7 {
     8     int to, next, cap, flow, cost;
     9 }edge[MAXM];
    10 int head[MAXN], tol;
    11 int pre[MAXN], dis[MAXN];
    12 bool vis[MAXN];
    13 int N;
    14 void init(int n) 
    15 {
    16     N = n;
    17     tol = 0;
    18     memset(head, -1, sizeof(head));
    19 }
    20 void addedge(int u, int v, int cap, int cost) 
    21 {
    22     edge[tol].to = v; edge[tol].cap = cap;
    23     edge[tol].cost = cost; edge[tol].flow = 0;
    24     edge[tol].next = head[u]; head[u] = tol++;
    25     edge[tol].to = u; edge[tol].cap = 0;
    26     edge[tol].cost = -cost; edge[tol].flow = 0;
    27     edge[tol].next = head[v]; head[v] = tol++;
    28 }
    29 bool spfa(int s, int t) 
    30 {
    31     queue<int> q;
    32     for(int i = 0; i < N; i++) 
    33     {
    34         dis[i] = INF;
    35         vis[i] = false;
    36         pre[i] = -1;
    37     }
    38     dis[s] = 0; vis[s] = true;
    39     q.push(s);
    40     while(!q.empty()) 
    41     {
    42         int u = q.front();
    43         q.pop();
    44         vis[u] = false;
    45         for(int i = head[u]; i != -1; i = edge[i].next)
    46         { 
    47             int v = edge[i].to;
    48             if(edge[i].cap > edge[i].flow && dis[v] > dis[u] + edge[i].cost) 
    49             {
    50                 dis[v] = dis[u] + edge[i].cost;
    51                 pre[v] = i;
    52                 if(!vis[v]) 
    53                 {
    54                     vis[v] = true;
    55                     q.push(v);
    56                 }
    57             }
    58         }
    59     }
    60     if(pre[t] == -1) return false;
    61     else return true;
    62 }
    63 //返回的是最大流,cost存的是最小费用
    64 int minCostMaxflow(int s, int t, int &cost) 
    65 {
    66     int flow = 0;
    67     cost = 0;
    68     while(spfa(s, t))
    69     {
    70         int Min = INF;
    71         for(int i = pre[t]; i != -1; i = pre[edge[i^1].to]) 
    72         {
    73             if(Min > edge[i].cap - edge[i].flow)
    74                 Min = edge[i].cap - edge[i].flow;
    75         }
    76         for(int i = pre[t]; i != -1; i = pre[edge[i^1].to]) 
    77         {
    78             edge[i].flow += Min;
    79             edge[i^1].flow -= Min;
    80             cost += edge[i].cost * Min;
    81         }
    82         flow += Min;
    83     }
    84     return flow;
    85 }
  • 相关阅读:
    java实现文件上传下载至ftp服务器
    理解java代理模式
    [置顶] 理解java中的线程池
    wait,notify,非阻塞队列实现生产者,消费者模型
    理解java阻塞队列BlockingQueue
    CentOS下安装配置Nginx
    putty笔记
    CentOs下安装jdk、MySql、Redis笔记
    简述yum和apt-get的区别
    Linux 文件颜色说明
  • 原文地址:https://www.cnblogs.com/yaoyueduzhen/p/5020384.html
Copyright © 2011-2022 走看看