日常训练 20170605 MediumProblem
来源:互联网 发布:ubuntu mate设置中文 编辑:程序博客网 时间:2024/06/02 04:46
题目描述:
Byteland 的首都 Bytetown 的有轨电车即将投入使用。Bytetown 中共有
电车的具体运营线路还没有确定,BytelandTramService(BTS)和GlobalTramNetworks(GTN)两家公司各自提出了一套线路方案。两套方案都由若干运营线路组成,每条线路有其起点、终点和旅客满意度(这是由BTS和GTN的分析师算出来的)。
现在的问题是,这两家公司不愿意合作,因此如果有某一个交会点同时有两家公司运营的线路经过,将会有发生冲突的可能。 最终,政府决定从BTS和GTN提出的方案中各取一个运营线路子集,使得来自BTS的线路和来自GTN的线路互不相交。请你找出满足上述要求的线路集所能达到的最大旅客满意度值和。
输入格式:
输入数据第一行包含三个整数
接下来的
然后是
然后是
对于两条线路是否有交只要把每条线路沿
做完这个判定后就变成了一个最小割模型了,有冲突的两边的路线只能取一个,连
这种题用
#include<bits/stdc++.h>const int N = 1e5 + 10;const int INF = 2e9;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';}int n, m1, m2, a[N], b[N], x[N], y[N], _x[N], _y[N], m[N], _m[N], ans;bool cross[705][705];namespace _cross{ const int N = 1e5 + 10; int first[N], s = 1, fa[N][20], dep[N], l[N], _l[N]; struct edge{ int y, next; }mp[N * 2]; void ins(int x, int y) { mp[++s] = (edge) {y, first[x]}; first[x] = s; mp[++s] = (edge) {x, first[y]}; first[y] = s; } void dfs(int x) { for (int i=1; dep[x] - (1 << i) >= 0; i++) fa[x][i] = fa[fa[x][i - 1]][i - 1]; for (int t=first[x]; t; t=mp[t].next) if (mp[t].y != fa[x][0]) fa[mp[t].y][0] = x, dep[mp[t].y] = dep[x] + 1, dfs(mp[t].y); } int lca(int x, int y) { if (dep[x] < dep[y]) std::swap(x, y); for (int i=19; i >= 0; i--) if (dep[x] - (1 << i) >= dep[y]) x = fa[x][i]; for (int i=19; i >= 0; i--) if (fa[x][i] != fa[y][i]) x = fa[x][i], y = fa[y][i]; if (x == y) return x; return fa[x][0]; } int up(int x, int k) { for (int i=19; i >= 0; i--) if (k & (1 << i)) x = fa[x][i]; return x; } bool cro(int x, int y, int _x, int _y) { return dep[lca(x, _x)] >= std::max(dep[y], dep[_y]); } int main() { for (int i=1; i < n; i++) ins(a[i], b[i]); dfs(1); for (int i=1; i <= m1; i++) l[i] = lca(x[i], y[i]); for (int i=1; i <= m2; i++) _l[i] = lca(_x[i], _y[i]); for (int i=1; i <= m1; i++) for (int j=1; j <= m2; j++) cross[i][j] = cro(x[i], l[i], _x[j], _l[j]) || cro(x[i], l[i], _y[j], _l[j]) || cro(y[i], l[i], _x[j], _l[j]) || cro(y[i], l[i], _y[j], _l[j]); return 0; }}namespace Dinic{ const int N = 1405; int first[N], cur[N], s = 1, S, T, q[N], h[N]; struct edge{ int y, v, next; }mp[N * N]; void ins(int x, int y, int v) { mp[++s] = (edge) {y, v, first[x]}; first[x] = s; mp[++s] = (edge) {x, 0, first[y]}; first[y] = s; } void build() { S = 0; T = m1 + m2 + 1; for (int i=1; i <= m1; i++) ins(S, i, m[i]); for (int i=1; i <= m2; i++) ins(m1 + i, T, _m[i]); for (int i=1; i <= m1; i++) for (int j=1; j <= m2; j++) if (cross[i][j]) ins(i, m1 + j, INF); } bool bfs() { for (int i=S; i <= T; i++) cur[i] = first[i], h[i] = 0; int head = 1, tail = 1; h[q[head] = S] = 1; for (int x = q[head]; head <=tail; x = q[++head]) for (int t = first[x]; t; t = mp[t].next) if (mp[t].v && !h[mp[t].y]) { h[mp[t].y] = h[x] + 1, q[++tail] = mp[t].y; if (mp[t].y == T) return 1; } return 0; } int dfs(int x, int fl) { if (x == T) return fl; int used = 0; for (int t = cur[x]; t; t = cur[x] = mp[t].next) if (h[x] + 1 == h[mp[t].y]) { int b = dfs(mp[t].y, std::min(mp[t].v, fl - used)); mp[t].v -= b; mp[t^1].v += b; used += b; if (used == fl) return used; } h[x] = -1; return used; } int main(){ build(); int ret = 0; while (bfs()) ret += dfs(S, INF); return ret; }}int main() { scanf("%d%d%d", &n, &m1, &m2); for (int i=1; i < n; i++) read(a[i]), read(b[i]); for (int i=1; i <= m1; i++) read(x[i]), read(y[i]), read(m[i]), ans += m[i]; for (int i=1; i <= m2; i++) read(_x[i]), read(_y[i]), read(_m[i]), ans += _m[i]; _cross::main(); printf("%d\n",ans - Dinic::main()); return 0;}
- 日常训练 20170605 MediumProblem
- 日常训练 20170605 EasyProblem
- 日常训练 20170605 费用流
- HEU日常训练10.02
- 日常训练小结
- 日常训练20161012 道路网
- 日常训练20161012 醉酒
- 日常训练20161014 跟踪
- 日常训练20161018 证据
- 日常训练20161018 subset
- 日常训练 平均数
- 日常训练 水箱
- 日常训练 棋盘游走
- 日常训练 20170531 数字
- 日常训练 20170531 探险
- 日常训练 20170531 矩阵
- 日常训练 20170602 Book
- 日常训练 20170602 Equation
- Python SQLAlchemy
- 微信小程序的选择收货地址、新增地址、地址管理等模块的总结(1)
- 服务实践—下载实例
- 结合实际项目理解集群和分布式的关系
- websphere集群环境下客户端访问没有响应
- 日常训练 20170605 MediumProblem
- 线程,进程,单线程,多线程,附有并发例子
- gdb调试多进程多线程
- Jenkins:持续化构建Android项目(四)
- 什么是内网和外网
- selenium+Python环境搭建
- 网络抓包工具及其使用
- 创建React Component的几种方式
- Mac下面的SecureCRT(附破解方案) 更新到最新的8.0.2[亲测可用]