[BZOJ 2285] [SDOI 2011] 保密
Description
Solution
这道题的最大难点在于读懂题意(雾
分数规划求出 \(n\) 到 \(1\cdots n_1\) 每个点的最小 \(\sum\frac{t_i}{s_i}\),然后转换成最小点权覆盖问题,最小点权覆盖 = 最大匹配数。
Code
#include <queue>
#include <cstdio>
#include <cstring>
#include <algorithm>
const double eps = 1e-8, INF = 1e9;
struct Edge1 { int v, nxt; double f, c; } e[80325];
struct Edge2 { int v, nxt, t, s; double w; } g[100005];
int n, m, nn, mm, hd[702], head[165], tot, S, T, cur[165], d[165], cnt;
int read() {
int x = 0; char c = getchar();
while (c < '0' || c > '9') c = getchar();
while (c >= '0' && c <= '9') x = (x << 3) + (x << 1) + (c ^ 48), c = getchar();
return x;
}
void add(int u, int v, int t, int s) {
g[++tot].nxt = hd[u], hd[u] = tot, g[tot].v = v, g[tot].t = t, g[tot].s = s;
}
void adde(int u, int v, double c) {
e[++tot].nxt = head[u], head[u] = tot, e[tot].v = v, e[tot].f = 0, e[tot].c = c;
e[++tot].nxt = head[v], head[v] = tot, e[tot].v = u, e[tot].f = 0, e[tot].c = 0;
}
bool bfs() {
bool vis[165] = {}; std::queue<int> q; vis[S] = 1, q.push(S);
while (!q.empty()) {
int u = q.front(); q.pop();
for (int i = head[u]; i; i = e[i].nxt)
if (!vis[e[i].v] && e[i].c > e[i].f + eps)
d[e[i].v] = d[u] + 1, vis[e[i].v] = 1, q.push(e[i].v);
}
return vis[T];
}
double dfs(int u, double a) {
if (u == T || a < eps) return a;
double flow = 0, x;
for (int &i = cur[u]; i; i = e[i].nxt)
if (d[u] + 1 == d[e[i].v] && (x = dfs(e[i].v, std::min(a, e[i].c - e[i].f))) > eps) {
e[i].f += x, e[i ^ 1].f -= x, flow += x, a -= x;
if (a < eps) break;
}
return flow;
}
double dinic() {
double flow = 0;
while (bfs()) memcpy(cur, head, sizeof head), flow += dfs(S, INF);
return flow;
}
bool check(int x, double mid) {
int d[702] = {}; double f[702] = {}; std::queue<int> q;
for (int i = 1; i <= m; ++i) g[i].w = g[i].t - mid * g[i].s, ++d[g[i].v];
for (int i = 1; i <= n; ++i) { if (!d[i]) q.push(i); f[i] = INF; }
f[n] = 0;
while (!q.empty()) {
int u = q.front(); q.pop();
for (int i = hd[u]; i; i = g[i].nxt) {
f[g[i].v] = std::min(f[g[i].v], f[u] + g[i].w);
if (--d[g[i].v] == 0) q.push(g[i].v);
}
}
return f[x] > eps;
}
bool bfs2() {
int cnt = 0, vis[702] = {}; std::queue<int> q;
q.push(n), vis[n] = 1, cnt += (n == nn);
while (!q.empty()) {
int u = q.front(); q.pop();
for (int i = hd[u]; i; i = g[i].nxt) if (!vis[e[i].v]) {
vis[e[i].v] = 1, q.push(e[i].v);
if ((cnt += (e[i].v <= nn)) == nn) return false;
}
}
return cnt < nn;
}
int main() {
n = read(), m = read();
for (int i = 1, u, v, t, s; i <= m; ++i)
u = read(), v = read(), t = read(), s = read(), add(u, v, t, s);
tot = 1, mm = read(), nn = read(), S = nn + 1, T = S + 1;
for (int i = 1, u, v; i <= mm; ++i) u = read(), v = read(), adde(u, v, INF);
if (bfs2()) { puts("-1"); return 0; }
for (int i = 1; i <= nn; ++i) {
double l = 0, r = 10, mid;
while (l + eps < r) {
mid = (l + r) / 2;
if (check(i, mid)) l = mid; else r = mid;
}
if (i & 1) adde(S, i, l); else adde(i, T, l);
}
printf("%.1lf\n", dinic());
return 0;
}
[BZOJ 2285] [SDOI 2011] 保密的更多相关文章
- [BZOJ 2243] [SDOI 2011] 染色 【树链剖分】
题目链接:BZOJ - 2243 题目分析 树链剖分...写了200+行...Debug了整整一天+... 静态读代码读了 5 遍 ,没发现错误,自己做小数据也过了. 提交之后全 WA . ————— ...
- BZOJ 2243 SDOI 2011染色
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2243 算法讨论: 树链剖分把树放到线段树上.然后线段树的每个节点要维护的东西有左端点的颜色 ...
- [BZOJ 2242] [SDOI 2011] 计算器
Description 你被要求设计一个计算器完成以下三项任务: 给定 \(y,z,p\),计算 \(y^z \bmod p\) 的值: 给定 \(y,z,p\),计算满足 \(xy≡ z \pmod ...
- BZOJ 2245 SDOI 2011 工作安排 费用流
题目大意:有一些商品须要被制造.有一些员工.每个员工会做一些物品,然而这些员工做物品越多,他们的愤慨值越大,这满足一个分段函数.给出哪些员工能够做哪些东西,给出这些分段函数,求最小的愤慨值以满足须要被 ...
- [BZOJ 1879][SDOI 2009]Bill的挑战 题解(状压DP)
[BZOJ 1879][SDOI 2009]Bill的挑战 Description Solution 1.考虑状压的方式. 方案1:如果我们把每一个字符串压起来,用一个布尔数组表示与每一个字母的匹配关 ...
- [BZOJ 2299][HAOI 2011]向量 题解(裴蜀定理)
[BZOJ 2299][HAOI 2011]向量 Description 给你一对数a,b,你可以任意使用(a,b), (a,-b), (-a,b), (-a,-b), (b,a), (b,-a), ...
- [BZOJ 3992] [SDOI 2015] 序列统计(DP+原根+NTT)
[BZOJ 3992] [SDOI 2015] 序列统计(DP+原根+NTT) 题面 小C有一个集合S,里面的元素都是小于质数M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数 ...
- [BZOJ 3123] [SDOI 2013]森林(可持久化线段树+并查集+启发式合并)
[BZOJ 3123] [SDOI 2013]森林(可持久化线段树+启发式合并) 题面 给出一个n个节点m条边的森林,每个节点都有一个权值.有两种操作: Q x y k查询点x到点y路径上所有的权值中 ...
- [BZOJ 2301] [HAOI 2011] Problem b (莫比乌斯反演)(有证明)
[BZOJ 2301] [HAOI 2011] Problem b (莫比乌斯反演)(有证明) 题面 T组询问,每次给出a,b,c,d,k,求\(\sum _{i=a}^b\sum _{j=c}^d[ ...
随机推荐
- vue2.5.2版本 :MAC设置应用在127.0.0.1:80端口访问; 并将127.0.0.1指向www.yours.com ;问题“ Invalid Host header”
0.设置自己的host文件,将127.0.0.1指向自己想要访问的域名 127.0.0.1 www.yours.com 1.MAC设置应用在127.0.0.1:80端口访问: config/index ...
- C++ 11 Lambda表达式
C++11的一大亮点就是引入了Lambda表达式.利用Lambda表达式,可以方便的定义和创建匿名函数.对于C++这门语言来说来说,“Lambda表达式”或“匿名函数”这些概念听起来好像很深奥,但很多 ...
- Linux内存描述之高端内存--Linux内存管理(五)
1. 内核空间和用户空间 过去,CPU的地址总线只有32位, 32的地址总线无论是从逻辑上还是从物理上都只能描述4G的地址空间(232=4Gbit),在物理上理论上最多拥有4G内存(除了IO地址空间, ...
- c/c++ 网络编程 UDP 改变网关和网卡名字
网络编程 UDP 改变网关和网卡名字 在程序里动态改变网关和网卡名字 1,改变网卡名字 #include <stdio.h> #include <string.h> #incl ...
- 如何设置Oracle数据库客户端字符集以及系统中的NLS_LANG环境变量
概述: 本地化是系统或软件运行的语言和文化环境.设置NLS_LANG环境参数是规定Oracle数据库软件本地化行为最简单的方式. NLS_LANG参数不但指定了客户端应用程序和Oracle数据库所使用 ...
- MySQL从查找数据库表到删除全过程
使用DOS命令进入MySQL:mysql -u root -p 按回车键输入密码显示如下界面成功进入MySQL交互界面. 如果此时不知道MySQL有哪些数据库,使用显示所有数据库名语句:show ...
- Eclipse出错不断,注册表不能乱改
Eclipse打不开,始终报错,还能不能开心的敲代码了??? 首先说下造成我这个愚蠢错误的起源:电脑是win10系统,本来是可以正常使用的.某一天,我正在使用python,打开命令提示符,看见开头是中 ...
- Java基础——0 前言
- MySQL 5.7.13 的一个BUG
mysql今天从5.6切到5.7,在测试环境中,日志是全部打印的,发现打了一个警告: Incorrect string value: '\xD6\xD0\xB9\xFA\xB1\xEA...' for ...
- tian
上次后来没继续在微信上聊,是因为快过年了,想趁那段时间结合年假做点东西.接下来阳历三四月份就受美国制裁.结果接下来制裁.fang. 16年的那次主要是生气,在一块儿 另外经济上也有问题. 我也想过不再 ...