hdu4966 GGS-DDU

有 \(n\) 个课程,每种课程有 \(a_i\) 级,一开始你每种课程都为 \(0\) 级,有 \(m\) 个升级方案:\((x,\ l1,\ y,\ l2,\ c)\) ,若你课程 \(x\) 已达到 \(l1\) 级,那么你可以花费 \(c\) 的价格,使得课程 \(y\) 达到 \(l2\) 级。求最小花费使得所有课程满级。

\(n\leq50,\ m\leq2\times10^3,\ a_i\leq500\)

最小树形图


将每个课程拆为 \(a_i\) 个点,分别表示此课程等级为 \(0\cdots a_i\) 。建一个虚拟根节点,连向所有等级为 \(0\) 的节点,边权为 \(0\) 。升级方案可以连边课程 \(x\) 的 \(l1\cdots a_x\) 到课程 \(y\) 的 \(l2\) ,边权为 \(c\) ,再从所有等级为 \(k\) 的节点向等级为 \(k-1\) 的节点连边,权值为 \(0\) ,接着跑最小树形图就吼辣

时间复杂度 \(O(m\sum a_i)\)

代码

#include <bits/stdc++.h>
using namespace std; const int maxn = 2.5e4 + 10, maxm = 1e6 + 10;
int n, m, k, a[60], mp[60][510], val[maxn], vis[maxn], pre[maxn], tid[maxn];
struct edges {
int u, v, w;
edges(int x = 0, int y = 0, int z = 0) : u(x), v(y), w(z) {}
} e[maxm]; int edmonds() {
int ans = 0;
while (1) {
memset(vis, 0, sizeof vis);
memset(tid, 0, sizeof tid);
memset(val, 0x3f, sizeof val);
for (int i = 1; i <= m; i++) {
int u = e[i].u, v = e[i].v;
if (u != v && e[i].w < val[v]) {
val[v] = e[i].w, pre[v] = u;
}
}
for (int i = 1; i < n; i++) {
if (val[i] > 1e9) return -1;
}
int tot = 0;
for (int i = 1; i < n; i++) {
int u = i;
ans += val[i];
while (u < n && !tid[u] && vis[u] != i) {
vis[u] = i, u = pre[u];
}
if (u < n && !tid[u]) {
tid[u] = ++tot;
for (int v = pre[u]; u != v; v = pre[v]) {
tid[v] = tot;
}
}
}
if (!tot) break;
for (int i = 1; i <= n; i++) {
if (!tid[i]) tid[i] = ++tot;
}
for (int i = 1; i <= m; i++) {
int u = e[i].u, v = e[i].v;
e[i].u = tid[u], e[i].v = tid[v];
if (u != v) e[i].w -= val[v];
}
n = tot;
}
return ans;
} void solve() {
m = 0;
for (int i = 1; i <= n; i++) {
scanf("%d", a + i);
mp[i][0] = mp[i - 1][a[i - 1]] + 1;
for (int j = 1; j <= a[i]; j++) {
mp[i][j] = mp[i][j - 1] + 1;
e[++m] = edges(mp[i][j], mp[i][j - 1], 0);
}
}
for (int i = 1; i <= k; i++) {
int p1, p2, l1, l2, w;
scanf("%d %d %d %d %d", &p1, &l1, &p2, &l2, &w);
for (int j = l1; j <= a[p1]; j++) {
e[++m] = edges(mp[p1][j], mp[p2][l2], w);
}
}
for (int i = 1; i <= n; i++) {
e[++m] = edges(mp[n][a[n]] + 1, mp[i][0], 0);
}
n = mp[n][a[n]] + 1;
printf("%d\n", edmonds());
} int main() {
while (scanf("%d %d", &n, &k) == 2 && n && k) {
solve();
}
return 0;
}

hdu4966 GGS-DDU的更多相关文章

  1. DDP和DDU什么区别

    DU/DDP 就是A发货给国外B,B只要呆在家里看电视,货会自动送上门,当中的所有运输清关等事情都是由A来负责(A可以委托货代来负责),区别就是DDU是不包括税金的,也就是货值的百分之多少,税金会在B ...

  2. hdu4966 最小树形图+虚根

    /* 辛辛苦苦调试半天, 过了样例,竟然没有ac!! 网上对比了ac代码,感觉添加一个虚根就能ac 但是想不明白为什么 */ /* 第二天想了下,知道了为什么wa:因为从等级0连到其他课程等级i的不止 ...

  3. WinDbg常用命令系列---显示引用的内存(dda、ddp、ddu、dpa、dpp、dpu、dqa、dqp、dqu)

    命令dda, ddp, ddu, dpa, dpp, dpu, dqa, dqp, 和 dqu在指定位置显示指针,取消对该指针的引用,然后以各种格式显示结果位置的内存. ddp [Options] [ ...

  4. HDU4966 GGS-DDU(最小树形图)

    之前几天想着补些算法的知识,学了一下最小树形图的朱刘算法,不是特别理解,备了份模板以备不时之需,想不到多校冷不丁的出了个最小树形图,没看出来只能表示对算法不太理解吧,用模板写了一下,然后就过了.- - ...

  5. GGS: Sybase to Oracle

    Step 1: Start the GGSCI on Source and Target Source Target Oracle GoldenGate Command Interpreter for ...

  6. 最小树形图(hdu4966多校联赛9)

    GGS-DDU Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total ...

  7. 【HDU4966】GGS-DDU

    题意 有n种科目,每个科目都有一个最高的等级a[i].开始的时候,每个科目的等级都是0.现在要选择一些课程进行学习使得每一个科目都达到最高等级.这里有m节课可供选择.对于每门课给出L1[i],c[i] ...

  8. hdu4966 最小树形图(最少辅导花费)

    题意:       以一些科目,和辅导班,每个科目最终要求修到某个等级,可以花一定的钱在辅导班把某一科目修到某一等级,进入辅导班的时候会有一个限制,那就是达到他给出的科目和等级限制,比如a b c d ...

  9. iOS GCD NSOperation NSThread等多线程各种举例详解

    废话就不多说,直接上干货.如下图列举了很多多线程的知识点,每个按钮都写有对应的详细例子,并对运行结果进行分析,绝对拿实践结果来说话.如果各位道友发现错误之处还请指正.附上demo下载地址

随机推荐

  1. IE浏览器的ActiveXObject对象以及FileSystemobject的应用扩展(完成)

    ActiveXObject 对象 启用和返回对自动化对象的引用.此对象仅用于实例化自动化对象,且此对象没有成员. 警告:此对象为 Microsoft 扩展,仅在 Internet Explorer 中 ...

  2. loj#6031. 「雅礼集训 2017 Day1」字符串(SAM 广义SAM 数据分治)

    题意 链接 Sol \(10^5\)次询问每次询问\(10^5\)个区间..这种题第一感觉就是根号/数据分治的模型. \(K\)是个定值这个很关键. 考虑\(K\)比较小的情况,可以直接暴力建SAM, ...

  3. 洛谷P3245 [HNOI2016]大数(莫队)

    题意 题目链接 Sol 莫队板子题.. 维护出每个位置开始的字符串\(mod P\)的结果,记为\(S_i\) 两个位置\(l, r\)满足条件当且仅当\(S_l - S_r = 0\),也就是\(S ...

  4. 一种快速构造和获取URL查询参数的方法:URLSearchParams

    URLSearchParams 接口定义了一些实用的方法来处理 URL 的查询字符串. URLSearchParams()是个构造函数,将返回一个可以操作查询字符串的对象. 常用方法: 1.构造查询字 ...

  5. FUNCTIONALITY OF ITEM CATEGORY

    Item Category Purpose This wiki page will breify discuss about functionality of Item Category in SAP ...

  6. 关于ARM CM3的启动文件分析

    下面以ARM Cortex_M3裸核的启动代码为例,做一下简单的分析.首先,在启动文件中完成了三项工作: 1.  堆栈以及堆的初始化 2.  定位中断向量表 3.  调用Reset Handler. ...

  7. shell中的set、seq、eval、exec、&&和||

    一.set 查看set 帮助: bash -c "help set" 选项: -e:任何命令执行失败(非0 status)直接退出 -x: 打印执行过程的命令行.参数 +e:命令执 ...

  8. EOS之记事本智能合约

    EOS记事本智能合约 本次分享的内容是一个记事本合约,调用合约中的写入动作可以将文本和作者保存到数据库中,通过记事本合约来学习EOS智能合约数据存储当中的主键自增. 合约动作 写入动作 记事本合约必须 ...

  9. 用emacs 阅读 c/c++ 代码

    在emacs编程中有以下需求 从调用一个函数的地方跳转到函数的定义的地方 或是反过来从函数定义的地方列出所有调用这个函数的地方 实现办法 需要安装以下软件 gnu global(阅读源代码的工具)官网 ...

  10. python opencv SIFT,获取特征点的坐标位置

    备注:SIFT算法的实质是在不同的尺度空间上查找关键点(特征点),并计算出关键点的方向.SIFT所查找到的关键点是一些十分突出,不会因光照,仿射变换和噪音等因素而变化的点,如角点.边缘点.暗区的亮点及 ...