最小树形图--朱刘算法([JSOI2008]小店购物)
题面
Sol
首先设一个 \(0\) 号点,向所有点连边,表示初始价值
显然这个图的一个 \(0\) 为根的最小有向生成树的边权和就是每个买一次的最小价值
再买就一定能优惠(包含 \(0\) 的边)
有向图最小生成树???
朱刘算法
其实正确性不会理论。。
可以说是一个不断调整的过程,从而得到最优解
时间复杂度 \(O(VE)\)
流程:
1.去掉自环
2.先给每个点选择一条最小的入边,并记录连过来的点
3.如果此时有点没有入边(除根以外),那么显然无解
4.算上每个点入边贡献,加入答案
5.如果没有有向环,那么做完结束
6.如果有,缩点,并且把连出去的边都减去连出去那个点的入边,因为贡献算过了
7.存储新图,对新图重复所有操作
Code
# include <bits/stdc++.h>
# define IL inline
# define RG register
# define Fill(a, b) memset(a, b, sizeof(a))
using namespace std;
typedef long long ll;
const int maxn(100005);
const double inf(1e9);
int n, tot, m, cnt, need[maxn], pre[maxn], vis[maxn], id[maxn];
double ans, cost[maxn], prize, inw[maxn];
struct Edge{
int u, v;
double w;
} e[maxn];
IL void DirectedMST(){
RG int num = n, rt = 1, idx;
while(true){
// 初始化
for(RG int i = 1; i <= num; ++i) id[i] = vis[i] = pre[i] = -1, inw[i] = inf;
// 选入边
for(RG int i = 1; i <= cnt; ++i)
if(inw[e[i].v] > e[i].w && e[i].u != e[i].v) inw[e[i].v] = e[i].w, pre[e[i].v] = e[i].u;
pre[rt] = rt, idx = inw[rt] = 0;
// 缩环,统计贡献
for(RG int i = 1; i <= num; ++i){
ans += inw[i];
if(vis[i] == -1){
RG int nw = i;
while(vis[nw] == -1) vis[nw] = i, nw = pre[nw];
if(vis[nw] == i && nw != rt){
id[nw] = ++idx;
for(RG int j = pre[nw]; j != nw; j = pre[j]) id[j] = idx;
}
}
}
// 没有环结束
if(!idx) return;
// 重标号,记录新图
for(RG int i = 1; i <= num; ++i) if(id[i] == -1) id[i] = ++idx;
for(RG int i = 1; i <= cnt; ++i)
e[i].w -= inw[e[i].v], e[i].u = id[e[i].u], e[i].v = id[e[i].v];
num = idx, rt = id[rt];
}
}
int main(){
scanf("%d", &tot), n = 2;
for(RG int i = 1; i <= tot; ++i){
scanf("%lf%d", &cost[n], &need[n]);
if(need[n]) e[++cnt] = (Edge){1, n, cost[n]}, vis[i] = n++;
}
--n, scanf("%d", &m);
for(RG int i = 1, a, b; i <= m; ++i){
scanf("%d%d%lf", &a, &b, &prize);
a = vis[a], b = vis[b];
if(a && b){
cost[b] = min(cost[b], prize);
e[++cnt] = (Edge){a, b, prize};
}
}
for(RG int i = 2; i <= n; ++i) ans += (need[i] - 1) * cost[i];
DirectedMST();
printf("%.2lf\n", ans);
return 0;
}
最小树形图--朱刘算法([JSOI2008]小店购物)的更多相关文章
- 最小树形图——朱刘算法(Edmonds)
定义:一个有向图,存在从某个点为根的,可以到达所有点的一个最小生成树,则它就是最小树形图. 朱刘算法实现过程: [在选出入边集后(看步骤1),若有向图中不存在有向环,说明该图就是最小树形图] 1,选入 ...
- POJ 3164 Command Network 最小树形图 朱刘算法
=============== 分割线之下摘自Sasuke_SCUT的blog============= 最 小树形图,就是给有向带权图中指定一个特殊的点root,求一棵以root为根的有向生成树T, ...
- POJ 3164 Command Network ( 最小树形图 朱刘算法)
题目链接 Description After a long lasting war on words, a war on arms finally breaks out between littlek ...
- poj3164(最小树形图&朱刘算法模板)
题目链接:http://poj.org/problem?id=3164 题意:第一行为n, m,接下来n行为n个点的二维坐标, 再接下来m行每行输入两个数u, v,表点u到点v是单向可达的,求这个有向 ...
- 洛谷P4716 【模板】最小树形图(朱刘算法)
题意 题目链接 Sol 朱刘算法?感觉又是一种神仙贪心算法 大概就是每次贪心的用每个点边权最小的入边更新答案,如果不行的话就缩起来找其他的边 不详细说了,丢链接走人.. #include<bit ...
- POJ - 3164-Command Network 最小树形图——朱刘算法
POJ - 3164 题意: 一个有向图,存在从某个点为根的,可以到达所有点的一个最小生成树,则它就是最小树形图. 题目就是求这个最小的树形图. 参考资料:https://blog.csdn.net/ ...
- bzoj 4349 最小树形图——朱刘算法
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4349. 学习博客:http://www.cnblogs.com/xzxl/p/7243466 ...
- Luogu2792 [JSOI2008]小店购物
Luogu2792 [JSOI2008]小店购物 重题 bzoj4349 最小树形图 有 \(n\) 个物品,每个物品有价格 \(c_i\) 和所需个数 \(k_i\) ,所有物品必须恰好买 \(k_ ...
- 【LuoguP2792 】[JSOI2008]小店购物(最小树形图)
题目链接 题目描述 小店的优惠方案十分简单有趣: 一次消费过程中,如您在本店购买了精制油的话,您购买香皂时就可以享受2.00元/块的优惠价:如果您在本店购买了香皂的话,您购买可乐时就可以享受1.50元 ...
随机推荐
- 在Myeclipse中查看android源码就是这么easy
在开发android 时不能查看源码必是很不爽的一件事,看过网上一些文章后(都是2.0以前的版本,跟我的2.2最新版本的配置是不一样的)不过还是给了我启示,通过配置终于可以在myeclipse中查看源 ...
- SpringBoot整合MyBatis及Thymeleaf
http://www.cnblogs.com/ludashi/archive/2017/05/08/6669133.html 上篇博客我们聊了<JavaEE开发之SpringBoot工程的创建. ...
- leetcode-79-单词搜索(用dfs解决)
题目描述: 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格.同一个单元格内的字母不允许 ...
- Oracle 11g
Oracle 11g 第一章 Oracle 11g数据库简介 1.1 认识Oracle11g Oracle 11g是Oracle 数据库最新的版本,目前已经被企业广泛的应用. 1.2 Oracl ...
- hiho#1449 重复旋律6 求长度为k的串最大次数 后缀自动机
题目传送门 题目大意:求长度为k的串的最大次数,把k从1到length的所有答案全部输出. 思路: 这道题放在$SAM$里就是求长度$k$对应的所有$right$集中最大的大小. 我们以$aabab$ ...
- 在JSP中常见问题,防止SpringMVC拦截器拦截js等静态资源文件的解决方案
方案一.拦截器中增加针对静态资源不进行过滤(涉及spring-mvc.xml) <mvc:resources location="/" mapping="/**/* ...
- 四大组件之Service
1 通过startService 1.1 与调用者相对独立,没有返回,用于播放音乐,下载文件 1.2 如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行.下次 ...
- 解决UnicodeDecodeError: 'ascii' code can't decode byte 0xef in position
今天在使用python的pip安装的时候出现了这个错误 UnicodeDecodeError: 'ascii' code can't decode byte 0xef in position 7: o ...
- CyclicBarrier正确的使用方法和错误的使用方法
CyclicBarrier是java推出的一个并发编程工具,它用在多个线程之间协同工作.线程约定到达某个点,到达这个点之后的线程都停下来,直到最后一个线程也到达了这个点之后,所有的线程才会得到释放.常 ...
- 剑指offer(11-20)编程题
二进制中1的个数 数值的整数次方 调整数组顺序使奇数位于偶数前面 链表中倒数第k个结点 反转链表 合并两个排序的链表 树的子结构 二叉树的镜像 顺时针打印矩阵 包含min函数的栈 11.输入一个整数, ...