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

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int N = 5e3 + 10;
 5 ll n, m, s, t, ans1, ans2, ee = 2;
 6 ll flg[N][N], vis[N], h[N],dis[N];
 7 struct edge{
 8     ll v, next, flow, w;
 9 }e[100100];
10 
11 void addedge(ll u, ll v, ll flow, ll w)
12 {
13     e[ee] = (edge){v, h[u], flow, w};
14     h[u] = ee++;
15 }
16 
17 struct Pre{
18     ll v, e_id;
19 }pre[N];
20 
21 ll bfs()
22 {
23     memset(vis, 0, sizeof(vis));
24     memset(dis, 0x3f, sizeof(dis));
25     vis[s] = dis[s] = 0;
26     queue<int>q;
27     q.push(s);
28     while(q.size())
29     {
30         ll u = q.front();
31         vis[u] = 0;
32         q.pop();
33         for(ll i = h[u]; i; i = e[i].next)
34         {
35             ll v = e[i].v, w = e[i].w;
36             if(e[i].flow > 0 && dis[u] + w < dis[v])
37             {
38                 pre[v].v = u;
39                 pre[v].e_id = i;
40                 dis[v] = dis[u] + w;
41                 if(!vis[v])
42                 {
43                     q.push(v);
44                     vis[v] = 1;
45                 }
46             }
47         }
48     }
49     return dis[t] != 0x3f3f3f3f3f3f3f3f;
50 }
51 void EK()
52 {
53     while(bfs())
54     {
55         ll mi = LONG_MAX;
56         for(int i = t; i != s; i = pre[i].v)mi = min(mi, e[pre[i].e_id].flow);
57         for(int i = t; i != s; i = pre[i].v)
58         {
59             e[pre[i].e_id].flow -= mi;
60             e[pre[i].e_id ^ 1].flow += mi;
61         }
62         ans1 += mi;
63         ans2 += mi * dis[t];
64     }
65     
66 }
67 int main()
68 {
69     ios::sync_with_stdio(false); cin.tie(0);
70     //freopen("P3381_8.in","r",stdin);    
71     cin >> n >> m >> s >> t;
72     ll u, v, flow, w;
73     for(int i = 1; i <= m; i++)
74     {
75         cin >> u >> v >> flow >> w;
76         addedge(u, v, flow, w);
77         addedge(v, u, 0, -w);
78     }
79     EK();
80     cout << ans1 << " " << ans2 <<"\n";
81     return 0;    
82 } 

 

posted @ 2022-05-03 19:34  matt-11  阅读(33)  评论(0)    收藏  举报