UVALive - 2197 Paint the Roads(费用流)
来源:互联网 发布:smail得到java 编辑:程序博客网 时间:2024/06/15 04:45
题目大意:有n个点,m条边,你的任务是选择其中的一些边,使得每条被选择的边组成一些没有公共边的回路,且每个城市恰好在其中的k个回路上,被选择的边的总权值要求最小
解题思路:k个回路,每个城市都有,表示每个城市的入度和出度都是k,所以以此建边
源点连向每个城市,容量为k,费用0
每个城市连向汇点,容量为k,费用0
边连接两个城市,容量为1,费用为权值
跑最小费用最大流
#include <cstdio>#include <cstring>#include <algorithm>#include <queue>#include <vector>using namespace std;#define N 1010#define INF 0x3f3f3f3fstruct Edge{ int from, to, cap, flow ,cost; Edge() {} Edge(int from, int to, int cap, int flow, int cost):from(from), to(to), cap(cap), flow(flow), cost(cost) {}};struct MCMF{ int n, m, source, sink, flow, cost; vector<Edge> edges; vector<int> G[N]; int d[N], f[N], p[N]; bool vis[N]; void init(int n) { this->n = n; for (int i = 0; i <= n; i++) G[i].clear(); edges.clear(); } void AddEdge(int from, int to, int cap, int cost) { edges.push_back(Edge(from, to, cap, 0, cost)); edges.push_back(Edge(to, from, 0, 0, -cost)); m = edges.size(); G[from].push_back(m - 2); G[to].push_back(m - 1); } bool BellmanFord(int s, int t, int &flow, int &cost) { for (int i = 0; i <= n; i++) d[i] = INF; memset(vis, 0, sizeof(vis)); vis[s] = 1; d[s] = 0; f[s] = INF; p[s] = 0; queue<int> Q; Q.push(s); while (!Q.empty()) { int u = Q.front(); Q.pop(); vis[u] = 0; for (int i = 0; i < G[u].size(); i++) { Edge &e = edges[G[u][i]]; if (e.cap > e.flow && d[e.to] > d[u] + e.cost) { d[e.to] = d[u] + e.cost; p[e.to] = G[u][i]; f[e.to] = min(f[u], e.cap - e.flow); if (!vis[e.to]) { vis[e.to] = true; Q.push(e.to); } } } } if (d[t] == INF) return false; flow += f[t]; cost += d[t]; int u = t; while (u != s) { edges[p[u]].flow += f[t]; edges[p[u] ^ 1].flow -= f[t]; u = edges[p[u]].from; } return true; } void Mincost(int s, int t) { flow = 0, cost = 0; while (BellmanFord(s, t, flow, cost)); }};MCMF mcmf;int n, m, k;void solve() { scanf("%d%d%d", &n, &m, &k); int source = 2 * n, sink = 2 * n + 1; mcmf.init(sink); for (int i = 0; i < n; i++) { mcmf.AddEdge(source, i * 2, k, 0); mcmf.AddEdge(i * 2 + 1, sink, k, 0); } int u, v, c; for (int i = 1; i <= m; i++) { scanf("%d%d%d", &u, &v, &c); mcmf.AddEdge(u * 2, v * 2 + 1, 1, c); } mcmf.Mincost(source, sink); if (mcmf.flow == k * n) printf("%d\n", mcmf.cost); else printf("-1\n");}int main() { int test; scanf("%d", &test); while (test--) solve(); return 0;}
0 0
- UVALive - 2197 Paint the Roads(费用流)
- UVALive 2197 Paint the Roads(费用流)
- UvaLive 2197 Paint the Roads(费用流)
- LA 2197 Paint the Roads 费用流
- Paint the Roads UVALive
- [省选前题目整理][LA 2197]Paint the Roads(费用流)
- uva 12092 - Paint the Roads(最小费用最大流)
- (intermediate) 最小费用流 UVA 12092 - Paint the Roads
- uva 12092 Paint the Roads(费用流)
- uva12092 Paint the Roads
- Uva-12092-Paint the Roads
- UVALive - 6266 Admiral 费用流
- Aizu 2304 Reverse Roads 费用流
- UVALive - 5095 Transportation(拆边+费用流)
- UVALive 6905Two Yachts(费用流)
- UVALive 5131 Chips Challenge 费用流
- UVALive 6622 Absurdistan Roads
- 【UVALive】 3353 Optimal Bus Route Design 费用流
- 用struts2开发,<result type="json"></result>是什么意思?
- iOS(总结)UIPickerView&&UIDatePicker&&toolBar
- 51nod 1265 四点共面(判四点共面)
- OC面向对象之第一个OC类
- smartforms的table如何初始化若干行
- UVALive - 2197 Paint the Roads(费用流)
- interface builder的身世
- UI 19 数据库的练习
- frameset iframe 用法
- EA导出代码
- SDUTOJ 3312
- 如何做实时监控?—— 参考 Spring Boot 实现
- 12v 1a 18w 开关电源原理图
- Swift - 集合类型