UVA 1658 (费用流)
来源:互联网 发布:酷盖是什么意思啊 知乎 编辑:程序博客网 时间:2024/03/29 16:40
求两条不相交从1到n路径的长度和的最小值.
每个点拆成入点出点,流量1费用为边权,拆成的两个点流量为1费用为0,除了源点和汇点流量为2.
#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>#include <vector>#include <queue>using namespace std;#define INF 11111111#define maxn 2111#define maxm 2111111int n, m;int s, t;struct node { int u, v, next, cap, flow, cost;}edge[maxm];int head[maxn], cnt;int pre[maxn], dis[maxn];bool vis[maxn];int N;void init () { memset (head, -1, sizeof head); cnt = 0;}void add_edge (int u, int v, int cap, int cost) { edge[cnt].u = u, edge[cnt].v = v, edge[cnt].cap = cap, edge[cnt].flow = 0; edge[cnt].cost = cost, edge[cnt].next = head[u], head[u] = cnt++; edge[cnt].u = v, edge[cnt].v = u, edge[cnt].cap = 0, edge[cnt].flow = 0; edge[cnt].cost = -cost, edge[cnt].next = head[v], head[v] = cnt++;}bool spfa (int s, int t) { queue <int> q; for (int i = 0; i < N; i++) { dis[i] = INF; vis[i] = 0; pre[i] = -1; } dis[s] = 0; vis[s] = 1; q.push (s); while (!q.empty ()) { int u = q.front (); q.pop (); vis[u] = 0; for (int i = head[u]; i != -1; i = edge[i].next) { int v = edge[i].v; if (edge[i].cap > edge[i].flow && dis[v] > dis[u]+edge[i].cost) { dis[v] = dis[u]+edge[i].cost; pre[v] = i; if (!vis[v]) { vis[v] = 1; q.push (v); } } } } if (pre[t] == -1) return 0; else return 1;}int MCMF (int s, int t, int &cost) { int flow = 0; cost = 0; while (spfa (s, t)) { int Min = INF; for (int i = pre[t]; i != -1; i = pre[edge[i^1].v]) { if (Min > edge[i].cap-edge[i].flow) { Min = edge[i].cap-edge[i].flow; } } for (int i = pre[t]; i != -1; i = pre[edge[i^1].v]) { edge[i].flow += Min; edge[i^1].flow -= Min; cost += edge[i].cost*Min; } flow += Min; } return flow;}int main () { //freopen ("in.txt", "r", stdin); while (scanf ("%d%d", &n, &m) == 2) { init (); add_edge (0, 1, 2, 0); add_edge (2*(n-1), 2*(n-1)+1, 2, 0); for (int i = 1; i < n-1; i++) { add_edge (i*2, i*2+1, 1, 0); } for (int i = 0; i < m; i++) { int u, v, w; scanf ("%d%d%d", &u, &v, &w); u--, v--; add_edge (2*u+1, 2*v, 1, w); } int cost = 0; N = 2*n; s = 0, t = 2*(n-1); MCMF (s, t, cost); printf ("%d\n", cost); } return 0;}
0 0
- UVA 1658 (费用流)
- 最小费用流: uva 1658
- UVA 1658 Admiral [费用流] [拆点]
- UVA 1658 Admiral (最小费用流)
- UVA 1658 - Admiral (拆点+最小费用流)
- UVA 1658Admiral(拆点+费用流)
- UVa 1658 Admiral (最小费用最大流、拆点法)
- UVA 1658 Admiral(拆点+最小费用流)
- uva 1486 - Transportation(最小费用流)
- UVA 10806 Dijkstra, Dijkstra.(费用流)
- uva 10806 - Dijkstra, Dijkstra.(费用流)
- uva 10594 - Data Flow(费用流)
- UVA 10594 - Data Flow(费用流)
- UVA 10806 - Dijkstra, Dijkstra.(费用流)
- UVA 11613 不确定流量费用流
- UVa 10806 Dijkstra, Dijkstra. 费用流
- UVA 10594 Data Flow (最小费用流)
- Dijkstra, Dijkstra. - UVa 10806 费用流
- 获取时间Calendar、使用 Date 和 SimpleDateFormat 类表示时间
- Android官网教你如何系统学习
- Android 图片拖拽、放大缩小的自定义控件
- PHP Mail
- Math的常用方法(用于操作数字)
- UVA 1658 (费用流)
- (原)浅谈C# runat="server"(新手值得注意)
- 在Ubuntu 15.10与fedora 23下修改mysql 5.7.11的编码方式为utf8
- 线程池管理类 Executors
- 时间戳转换
- java 注解的几大作用及使用方法详解(完)
- 密码算法详解——AES
- SpringMVC学习系列(6) 之 数据验证
- sql-"无法删除数据库,因为该数据库当前正在使用"问题解决