网络流二十四题 最长 k 可重区间集
来源:互联网 发布:广场舞下载软件 编辑:程序博客网 时间:2024/06/06 07:34
Poweroj和codevs上数据都有问题,点这里可以提交:https://oj.hsefz.info/problem/13
题意:记一个开区间
对于给定的开区间集合
这个问题可以看作从头到尾选
先把节点离散化,相邻节点
对与每个区间在数轴上连一条流量
#include<bits/stdc++.h>const int N = 20050;const int INF = 1e9;template <typename T> void read(T &x) { x = 0; char c = getchar(); for (; !isdigit(c); c = getchar()); for (; isdigit(c); c = getchar()) x = x * 10 + c - '0';}struct edge { int x, y, f, v, next;}mp[N * 10];int n, k, l[N], r[N], a[N], b[N], first[N], s, q[N + 9], from[N], S, _S, T;bool inq[N];long long dis[N], ans;void ins(int x, int y, int f, int v) { //printf("ins x=%d y=%d f=%d v=%d\n", x, y, f, v); mp[++s] = (edge) {x, y, f, v, first[x]}; first[x] = s; mp[++s] = (edge) {y, x, 0, -v, first[y]}; first[y] = s;}bool SPFA() { for (int i=S; i <= T; i++) dis[i] = 1, inq[i] = 0; int head = 1, tail = 2; inq[q[head] = S] = 1; dis[q[head]] = 0; while (head != tail) { int x = q[head]; //printf("x=%d\n", x); for (int t=first[x]; t; t=mp[t].next) { //printf("y=%d\n", mp[t].y); if (mp[t].f && dis[x] + mp[t].v < dis[mp[t].y]) { dis[mp[t].y] = dis[x] + mp[t].v; from[mp[t].y] = t; if (!inq[mp[t].y]) { inq[q[tail++] = mp[t].y] = 1; if (tail > N) tail = 1; } } } inq[q[head++]] = 0; if (head > N) head = 1; } return dis[T] != 1;}void mcf() { int fl = INF; for (int x=T; x != S; x = mp[from[x]].x) fl = std::min(fl, mp[from[x]].f); for (int x=T; x != S; x = mp[from[x]].x) mp[from[x]].f -= fl, mp[from[x]^1].f += fl; ans += dis[T] * fl;}int find(int x) { int l = 1, r = n * 2; while (l < r) { int mid = (l + r + 1) / 2; if (a[mid] > x) r = mid - 1; else l = mid; } return b[l];}int main() { read(n); read(k); for (int i=1; i <= n; i++) { read(l[i]), read(r[i]); if (l[i] > r[i]) std::swap(l[i], r[i]); a[i*2-1] = l[i], a[i*2] = r[i]; } std::sort(a+1, a+n*2+1); for (int i=1; i <= n * 2; i++) b[i] = b[i - 1] + (i == 1 || a[i] > a[i - 1]); S = 0; _S = b[n * 2] + 1; T = b[n * 2] + 2; s = 1; for (int i=1; i < b[n * 2]; i++) ins(i, i + 1, INF, 0); for (int i=1; i <= n; i++) ins(find(l[i]), find(r[i]), 1, -(r[i] - l[i])); ins(S, _S, k, 0); ins(_S, 1, INF, 0); ins(b[n * 2], T, INF, 0); while (SPFA()) mcf(); printf("%lld\n", -ans); return 0;}
阅读全文
0 0
- 网络流二十四题 最长 k 可重区间集
- [网络流 24 题] 最长 k 可重区间集
- 【网络流24题】最长k可重区间集(最大费用流+二分图)
- loj6014「网络流 24 题」最长 k 可重区间集(费用流)
- 网络流24题 21最长k可重区间集问题
- 最长 k 可重区间集问题[网络流24题之21]
- 【网络流24题】最长k可重区间集问题
- 网络流24题21. 最长 k 可重区间集问题
- 网络流24题之T21——最长 k 可重区间集问题
- 「网络流 24 题」最长 k 可重区间集
- 最长 k 可重区间集问题
- 最长k可重区间集问题
- 线性规划与网络流24——最长k可重区间集问题
- [网络流24题] 21 最长k可重区间集(最大权不相交路径 ,最小费用最大流)
- nefu495最长k可重区间集问题【最大权不相交路径】网络流24题
- 线性规划与网络流24题之最长k可重区间集问题 最大权不相交路径(最大费用最大流)
- nefu495最长k可重区间集问题
- 【网络流24题】最长k可重线段集问题(未解决)
- PoEdu-Windows班-007 异步I/O
- Linux内核链表之哈希链表
- 合法练习黑客技术?这15个网站也许可以帮到你
- 常用Linux命令:grep
- js 鼠标移入渐变效果
- 网络流二十四题 最长 k 可重区间集
- Julia: eval的一些用法
- RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2->新增模块管理界面导出功能(可按条件导出)
- 常用控件
- unity获取Camera类型的对象
- Android 异步消息处理机制解析
- 【EXCEL】EXCEL做出下拉菜单
- 关于数据获取的几点经验
- Oracle多表连接