BZOJ 2260 商店购物(最小树形图)
不会最小树形图的出门左转
其实如果确定每种商品第一件的购买顺序,那么剩下的商品肯定是以最优惠价格购买的。
如何确定各种商品第一件购买时的最小价值呢?
考虑如果购买了\(a_i\)这种商品,那么就能以\(c_i\)的价格购买\(b_i\)这种商品,考虑从\(a_i\)往\(b_i\)连权值为\(c_i\)的有向边。
初始建一个额外的\(S\)点往所有点i连权值为\(v_i\)的有向边。
然后用朱刘算法求一遍最小树形图就行了。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
#define int long long
const double INF=1e9;
const int N=110;
const int M=10100;
int n,m,r,tru[N];
double ans,mn[N],c[N],num[N];
struct edge{
int u,v;
double w;
}e[M];
int cnt,id[N],top[N],fa[N];
bool work(){
while(2333){
memset(id,0,sizeof(id));
memset(top,0,sizeof(top));
for(int i=1;i<=n;i++)mn[i]=INF;
for(int i=1;i<=m;i++)
if(e[i].u!=e[i].v&&e[i].w<mn[e[i].v])
fa[e[i].v]=e[i].u,mn[e[i].v]=e[i].w;
mn[r]=0;fa[r]=0;
for(int i=1;i<=n;i++)if(mn[i]==INF)return false;
int u;
for(int i=1;i<=n;i++){
ans+=mn[i];
for(u=i;u!=r&&top[u]!=i&&!id[u];u=fa[u])top[u]=i;
if(u!=r&&!id[u]){
id[u]=++cnt;
for(int v=fa[u];v!=u;v=fa[v])id[v]=cnt;
}
}
if(!cnt)return true;
for(int i=1;i<=n;i++)if(!id[i])id[i]=++cnt;
for(int i=1;i<=m;i++){
double last=mn[e[i].v];
e[i].u=id[e[i].u];e[i].v=id[e[i].v];
if(e[i].u!=e[i].v)e[i].w-=last;
}
n=cnt;
r=id[r];
cnt=0;
}
}
int read(){
int sum=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){sum=sum*10+ch-'0';ch=getchar();}
return sum*f;
}
signed main(){
int tot=read();n=0;
for(int i=1;i<=tot;i++){
scanf("%lf",&c[++n]);
num[n]=read()-1;
if(num[n]<0){n--;continue;}
tru[i]=n;
}
m=read();
r=++n;
for(int i=1;i<=n-1;i++)e[m+i].u=r,e[m+i].v=i,e[m+i].w=c[i];
for(int i=1;i<=m;i++){
int u=read(),v=read();
double w;
scanf("%lf",&w);
if(tru[v]==0||tru[u]==0)continue;
e[i].u=tru[u];e[i].v=tru[v];e[i].w=w;
c[tru[v]]=min(c[tru[v]],w);
}
m+=n-1;
for(int i=1;i<=n-1;i++)ans+=num[i]*c[i];
if(work())printf("%.2lf",ans);
else printf("-1");
return 0;
}
BZOJ 2260 商店购物(最小树形图)的更多相关文章
- 【Bzoj2260】【Bzoj4349】商店购物 & 最小树形图
目录 List Bzoj 2260 商店购物 Description Input Output Sample Input Sample Output Bzoj 4349 最小树形图 Descripti ...
- 【刷题】BZOJ 2260 商店购物
Description Grant是一个个体户老板,他经营的小店因为其丰富的优惠方案深受附近居民的青睐,生意红火.小店的优惠方案十分简单有趣.Grant规定:在一次消费过程中,如果您在本店购买了精制油 ...
- Luogu2792 JSOI2008 小店购物 最小树形图
传送门 被题意杀 本以为一个种类的物品一定要一起买 看了题解才知道可以先把所有要买的物品买一个,剩下要买的物品就可以得到这个种类的物品能够得到的最大优惠-- 所以现在只需要知道:第一次买所有物品一遍时 ...
- 【LuoguP2792 】[JSOI2008]小店购物(最小树形图)
题目链接 题目描述 小店的优惠方案十分简单有趣: 一次消费过程中,如您在本店购买了精制油的话,您购买香皂时就可以享受2.00元/块的优惠价:如果您在本店购买了香皂的话,您购买可乐时就可以享受1.50元 ...
- 洛谷P2792 [JSOI2008]小店购物(最小树形图)
题意 题目链接 Sol 一开始的思路:新建一个虚点向每个点连边,再加上题面中给出的边,边权均为大小*需要购买的数量 然后发现死活都过不去 看了题解才发现题目中有个细节--买了\(A\)就可以买\(B\ ...
- bzoj2260: 商店购物 && 4349: 最小树形图
Description Grant是一个个体户老板,他经营的小店因为其丰富的优惠方案深受附近居民的青睐,生意红火.小店的优惠方案十分简单有趣.Grant规定:在一次消费过程中,如果您在本店购买了精制油 ...
- bzoj2260: 商店购物&&4349: 最小树形图
最小树形图问题啊 最小树形图是撒哩,就是给你一个有向图,确定一个根,要你到达所有点,那棵最短路径树的总边权 做这个用的是朱(jv)刘(lao)算法. 首先假如有多个联通块就无解啦 对应每个点(除了根) ...
- [JSOI2008]小店购物 & bzoj4349:最小树形图 最小树形图
---题面(洛谷)--- ---题面(bzoj)--- 其实是同一道题,,,样例都一模一样 题解: 一开始看想了好久,,,还想到了最短路和最小生成树,,然而写的时候才意识到最小生成树应该要用无向边 其 ...
- 【BZOJ】4349: 最小树形图
题解 我们只考虑给每个点买一个,之后每个点就可以用最低价格买了 根据最小树形图的算法,就是不断给每个点入度的边找一条最小的 如果构成了树形图就退出,否则把形成了环的点缩成一个点,加上环的权值,然后把指 ...
随机推荐
- nyoj181-小明的难题
小明的难题时间限制:3000 ms | 内存限制:65535 KB难度:2描述课堂上小明学会了用计算机求出N的阶乘,回到家后就对妹妹炫耀起来.为了不让哥哥太自满,妹妹给小明出了个问题"既 ...
- 2、Ansible配置文件详解
0.配置文件 两个核心文件:ansible.cfg和hosts文件,默认都存放在/etc/ansible目录下. ansible.cfg:主要设置一些ansible初始化的信息,比如日志存放路径.模块 ...
- Ubuntu环境搭建svn服务器
记录一次使用Ubuntu环境搭建svn服务器的详细步骤 一.查看是否已经安装svn 命令:svn如果显示以下信息,说明已安装 二.卸载已安装的svn 命令:sudo apt-get remove ...
- Swoole 同步模式与协程模式的对比
在现代化 PHP 高级开发中,Swoole 为 PHP 带来了更多可能,如:常驻内存.协程,关于传统的 Apache/FPM 模式与常驻内存模式(同步)的巨大差异,之前我做过测试,大家能直观的感受到性 ...
- C#封装成DLL,并在C#中调用
一.C#封装成DLL 1.在VS中创建项目选择类库,命名 myDll 2.建立好项目后自动生成的代码如下: 代码修改如下,添加自己要封装的C#代码,注意修饰符必须为public using Syste ...
- C#中的全局程序集缓存定义
安装有公共语言运行时的每台计算机都具有称为全局程序集缓存的计算机范围内的代码缓存.全局程序集缓存中存储了专门指定给由计算机中若干应用程序共享的程序集. 应当仅在需要时才将程序集安装到全局程序集缓存中以 ...
- substring类型题目的解题模板
https://discuss.leetcode.com/topic/30941/here-is-a-10-line-template-that-can-solve-most-substring-pr ...
- SqlCommand.DeriveParameters failed
错误信息例如以下: SqlCommand.DeriveParameters failed because the SqlCommand.CommandText property value is an ...
- Codeforces Round #168 (Div. 2)---A. Lights Out
Lights Out time limit per test 2 seconds memory limit per test 256 megabytes input standard input ou ...
- UML期末绘图及细节总结
往届期末绘图的题目例如以下所看到的: Read the providing materials carefully, and then do tasks. 2.1: Use Case Diagram ...