一点疑问

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

@[345678910jqka](/user/62075) 洛谷不需要freopen,但是最好把代码贴一下,这样会更好的找出错误
by 05493281ax @ 2022-09-29 00:45:33


我这也是,不知道为啥 ```cpp #include<bits/stdc++.h> using namespace std; typedef unsigned long long ull; const long long N = 1e5+100; long long cnt = 0; struct topo//拓扑序列 { }; namespace wll//网络流 { struct Edge { long long to, rest, w; } edge[N * 5]; } struct eftzdpp//二分图最大匹配 --最大流 { }; struct eftzxfyzdl//二分图最大权匹配 -- 最小费用最大流 { long long d[N], p[N], flow, cost, f[N]; vector<long long> g[N]; bool BFS(long long s, long long t) { memset(f, 0, sizeof f ); bool inq[N]; memset(inq, 0, sizeof inq); memset(d, 61, sizeof d); d[s] = 0; queue<long long> q; inq[s] = 1; f[s] = 1e8; q.push(s); while (q.size()) { long long now = q.front(); q.pop(); inq[now]=0; for (long long i = 0;i< g[now].size(); ++i) { long long &tt = g[now][i]; if ((wll::edge[tt].rest > 0) &&( d[wll::edge[tt].to] > wll::edge[tt].w + d[now]) &&( min(f[now], wll::edge[tt].rest))) { f[wll::edge[tt].to] = min(f[now], wll::edge[tt].rest); d[wll::edge[tt].to] = wll::edge[tt].w + d[now]; p[wll::edge[tt].to] = tt; if (f[wll::edge[tt].to] && inq[wll::edge[tt].to] == 0) { q.push(wll::edge[tt].to); inq[wll::edge[tt].to] = 1; } if (wll::edge[tt].to == t) return 1; } } } return 0; } void work(long long s, long long t) { long long uuu = 0; while (BFS(s, t)!=0 ) { cost += (d[t] * f[t]); flow += f[t]; long long now = t; while (now != s ) { wll::edge[p[now]].rest -= f[t]; // cout << wll::edge[p[now]].rest << "\n"; wll::edge[p[now] ^ 1].rest += f[t]; now = wll::edge[p[now] ^ 1].to; } // cout<<now<<"\n"; } // BFS(s,t); } }; //二分图最大独立集,最小点覆盖 struct tarjan//强连通分量,割点,桥,双连通分量,缩点 { }; struct oula//欧拉路径的存在性和方案输出 { }; signed main() { freopen("input.in","r",stdin); eftzxfyzdl A; long long n, m, s, t; ios::sync_with_stdio(0); cin >> n >> m; s=1,t=n; while (m--) { // cout<<cnt<<"\n"; long long u, v, w, c; cin >> u >> v >> w >> c; A.g[u].push_back(cnt); wll::edge[cnt].to = v; wll::edge[cnt].rest = w; wll::edge[cnt].w = c; cnt++; swap(u, v); A.g[u].push_back(cnt); wll::edge[cnt].to = v; wll::edge[cnt].rest = 0; wll::edge[cnt].w = -c ; cnt++; } A.work(s, t); cout << A.flow << " " << A.cost; } /* 4 4 4 3 4 2 30 2 2 3 20 1 2 1 30 9 1 3 40 5 */ ```
by YHZ66 @ 2022-10-27 10:15:57


|