[BZOJ3931][CQOI2015]网络吞吐量(SPFA+网络最大流)
来源:互联网 发布:淘宝发布宝贝预览 编辑:程序博客网 时间:2024/05/22 15:08
首先,跑一遍SPFA,设
而现在的问题是要限制一个点流出的流量。考虑到这一点,就把一个点拆成一个入点和一个出点,点
注意long long。
代码:
#include <cmath>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;inline int read() { int res = 0; bool bo = 0; char c; while (((c = getchar()) < '0' || c > '9') && c != '-'); if (c == '-') bo = 1; else res = c - 48; while ((c = getchar()) >= '0' && c <= '9') res = (res << 3) + (res << 1) + (c - 48); return bo ? ~res + 1 : res;}typedef long long ll;const int N = 1e4 + 5, M = 7e5 + 5; const ll INF = 1e18;int n, m, ecnt = 1, nxt[M], adj[N], go[M], ecnt2, nxt2[M], adj2[N], go2[M],val2[M], que[M], lev[N], len, S, T; ll C[N], dis[N], cap[M];bool vis[N];void add_edge(int u, int v, ll w) { nxt[++ecnt] = adj[u]; adj[u] = ecnt; go[ecnt] = v; cap[ecnt] = w; nxt[++ecnt] = adj[v]; adj[v] = ecnt; go[ecnt] = u; cap[ecnt] = 0;}void add_edge2(int u, int v, int w) { nxt2[++ecnt2] = adj2[u]; adj2[u] = ecnt2; go2[ecnt2] = v; val2[ecnt2] = w; nxt2[++ecnt2] = adj2[v]; adj2[v] = ecnt2; go2[ecnt2] = u; val2[ecnt2] = w;}void SPFA(int st) { int i; for (i = 1; i <= n; i++) dis[i] = INF; dis[que[len = 1] = st] = 0; for (i = 1; i <= len; i++) { int u = que[i]; vis[u] = 0; for (int e = adj2[u], v; e; e = nxt2[e]) if (dis[u] + 1ll * val2[e] < dis[v = go2[e]]) { dis[v] = dis[u] + 1ll * val2[e]; if (!vis[v]) vis[que[++len] = v] = 1; } }}void INIT() { int i; S = 1; T = n << 1; SPFA(1); for (i = 1; i < T; i += 2) add_edge(i, i + 1, C[(i >> 1) + 1]); for (i = 1; i <= n; i++) for (int e = adj2[i]; e; e = nxt2[e]) if (dis[i] + 1ll * val2[e] == dis[go2[e]]) add_edge(i << 1, (go2[e] << 1) - 1, INF);}bool bfs() { int i; memset(lev, -1, sizeof(lev)); lev[que[len = 1] = S] = 0; for (i = 1; i <= len; i++) { int u = que[i]; for (int e = adj[u], v; e; e = nxt[e]) if (cap[e] > 0 && lev[v = go[e]] == -1) { lev[que[++len] = v] = lev[u] + 1; if (v == T) return 1; } } return 0;}ll dinic(int u, ll flow) { if (u == T) return flow; ll res = 0, delta; for (int e = adj[u], v; e; e = nxt[e]) if (cap[e] > 0 && lev[u] < lev[v = go[e]]) { delta = dinic(v, min(cap[e], flow - res)); if (delta) { cap[e] -= delta; cap[e ^ 1] += delta; res += delta; if (res == flow) break; } } if (res != flow) lev[u] = -1; return res;}ll solve() { ll res = 0; while (bfs()) res += dinic(S, INF); return res;}int main() { int i, x, y, z; n = read(); m = read(); for (i = 1; i <= m; i++) x = read(), y = read(), z = read(), add_edge2(x, y, z); for (i = 1; i <= n; i++) C[i] = read(); C[1] = C[n] = INF; printf("%lld\n", (INIT(), solve())); return 0;}
阅读全文
0 0
- 【bzoj3931】【CQOI2015】【网络吞吐量】【spfa+最大流】
- [bzoj3931][CQOI2015]网络吞吐量 spfa+最大流
- [BZOJ3931][CQOI2015]网络吞吐量(SPFA+网络最大流)
- [BZOJ3931][CQOI2015]网络吞吐量(spfa+最大流)
- bzoj3931[CQOI2015]网络吞吐量
- bzoj3931【CQOI2015】网络吞吐量
- [BZOJ3931]CQOI2015网络吞吐量|最短路|最大流
- [BZOJ3931] [CQOI2015]网络吞吐量 && 网络流
- [BZOJ3931][CQOI2015][网络流]网络吞吐量[水题]
- bzoj3931: [CQOI2015]网络吞吐量 网络流
- 【BZOJ3931】【CQOI2015】网络吞吐量(最短路,网络流)
- cqoi2015网络吞吐量(bzoj3931,洛谷3171)
- BZOJ3931 网络吞吐量(最大流)
- 【BZOJ3931】【CQOI2015】网络吞吐量 最短路+网络流
- BZOJ3931网络吞吐量
- 3931: [CQOI2015]网络吞吐量 最短路+最大流
- 【BZOJ 3931】[CQOI2015]网络吞吐量 dijkstra+最大流
- BZOJ 3931 [CQOI2015]网络吞吐量 最短路+最大流
- 九九乘法
- LeetCode题解 第九周
- tf.transpose (API r1.3)
- 归纳一下C语言
- ReTrofit请求post
- [BZOJ3931][CQOI2015]网络吞吐量(SPFA+网络最大流)
- 静态变量
- 【JSP开发】利用cookie实现商品浏览记录
- The Counting Problem UVA
- Android性能优化之Ubuntu安装Battery Historian分析电量
- React Native 键盘弹起、收起动画与输入框的动作(几乎)完美同步
- scala 函数定义格式
- hdu 1358 Period
- JSF中调用js函数方法之一和二