码迷,mamicode.com
首页 > 其他好文 > 详细

P3381 【模板】最小费用最大流

时间:2019-11-27 15:00:15      阅读:50      评论:0      收藏:0      [点我收藏+]

标签:main   alt   void   spl   one   cst   inline   click   col   

技术图片
  1 #include<iostream>
  2 #include<queue>
  3 #include<cstring>
  4 #include<cstdio>
  5 using namespace std;
  6 
  7 #define Design ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
  8 #define mfor(i,a,b) for(register int i=(a);i<=(b);i++)
  9 
 10 const int maxn = 5010;
 11 const int maxm = 100010;
 12 const int INF = 0x3f3f3f3f;
 13 int cnt;
 14 int n, m;
 15 int h[maxn];
 16 int prep[maxn];
 17 int pree[maxm];
 18 int dis[maxn];
 19 int st = maxn - 2;
 20 int ed = maxn - 1;
 21 
 22 struct Edge
 23 {
 24     int v, nxt;
 25     int w, f;
 26 }e[maxm];
 27 
 28 int head[maxn];
 29 
 30 inline void init()
 31 {
 32     memset(head, -1, sizeof(head));
 33     cnt = 1;
 34 }
 35 
 36 inline void add(int u, int v, int w, int f)
 37 {
 38     e[++cnt].v = v;
 39     e[cnt].nxt = head[u];
 40     head[u] = cnt;
 41     e[cnt].f = f;
 42     e[cnt].w = w;
 43     e[++cnt].v = u;
 44     e[cnt].nxt = head[v];
 45     head[v] = cnt;
 46     e[cnt].f = -f;
 47     e[cnt].w = 0;
 48 }
 49 
 50 inline pair<int, int> dijstra()
 51 {
 52     int maxf = 0;
 53     int minc = 0;
 54     while (1)
 55     {
 56         priority_queue<pair<int, int>>heap;
 57         memset(dis, 0x3f, sizeof(dis));
 58         dis[st] = 0;
 59         heap.push(make_pair(0, st));
 60         while (!heap.empty())
 61         {
 62             pair<int, int> x = heap.top();
 63             heap.pop();
 64             if (-x.first != dis[x.second]) continue;
 65             if (x.second == ed) break;
 66             for (int i = head[x.second]; i != -1; i = e[i].nxt)
 67             {
 68                 int now = e[i].f + h[x.second] - h[e[i].v];
 69                 if (e[i].w > 0 && dis[e[i].v] > dis[x.second] + now)
 70                 {
 71                     dis[e[i].v] = dis[x.second] + now;
 72                     heap.push(make_pair(-dis[e[i].v], e[i].v));
 73                     prep[e[i].v] = x.second;
 74                     pree[e[i].v] = i;
 75                 }
 76             }
 77         }
 78         if (dis[ed] >= 0x3f3f3f3f) break;
 79         for (int i = 0; i <= n; i++) h[i] += dis[i];
 80         int now = 0x3f3f3f3f;
 81         for (int i = ed; i != st; i = prep[i])
 82             now = min(now, e[pree[i]].w);
 83         for (int i = ed; i != st; i = prep[i])
 84         {
 85             e[pree[i]].w -= now;
 86             e[pree[i] ^ 1].w += now;
 87         }
 88         maxf += now;
 89         minc += now * h[ed];
 90     }
 91     return make_pair(maxf, minc);
 92 }
 93 
 94 int main()
 95 {
 96     Design;
 97     init();
 98     cin >> n >> m;
 99     cin >> st >> ed;
100     mfor(i, 1, m)
101     {
102         int u, v, w, f;
103         cin >> u >> v >> w >> f;
104         add(u, v, w, f);
105     }
106     pair<int, int>ans = dijstra();
107     cout << ans.first << " " << ans.second;
108 }
View Code

 

P3381 【模板】最小费用最大流

标签:main   alt   void   spl   one   cst   inline   click   col   

原文地址:https://www.cnblogs.com/thjkhdf12/p/11942258.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!