bzoj4349: 最小树形图&&bzoj2260: 商店购物
双倍经验大法吼
昨天发现不会最小属性图&朱刘算法啊
吓得我赶紧补了一发
朱刘算法模板题
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#define N 55
#define M 2505 using namespace std;
struct edge{
int from,adj,next;double len;
edge(){}
edge(int _from,int _adj,int _next,double _len):from(_from),adj(_adj),next(_next),len(_len){}
} e[M];
int n,g[N],m;
void AddEdge(int u,int v,double w){
e[++m]=edge(u,v,g[u],w);g[u]=m;
} double in[N];
int prep[N];
int vis[N],stamp;
int bl[N],cnt;
double directed_MST(){
double ret=0;
e[0].adj=0;
for (;;){
memset(in,127,sizeof(in));
memset(prep,0,sizeof(prep));
for (int u=1;u<=n;++u)
for (int i=g[u];i;i=e[i].next)
if (e[i].len<in[e[i].adj])
in[e[i].adj]=e[i].len,prep[e[i].adj]=u;
for (int i=1;i<=n;++i) if (prep[i]) ret+=in[i];
memset(vis,0,sizeof(vis));vis[0]=stamp=1;
memset(bl,0,sizeof(bl));cnt=0;
for (int i=1;i<=n;++i)if (!vis[i]){
int u=i;
++stamp;
for (;!vis[u];u=prep[u]) vis[u]=stamp;
if (vis[u]==stamp){
++cnt;
for (;!bl[u];u=prep[u]) bl[u]=cnt;
}
}
if (!cnt) return ret;
for (int i=1;i<=n;++i) if (!bl[i]) bl[i]=++cnt;
int m0=m;
memset(g,0,sizeof(g));m=1;
for (int i=2;i<=m0;++i)
if (bl[e[i].from]!=bl[e[i].adj])
AddEdge(bl[e[i].from],bl[e[i].adj],e[i].len-in[e[i].adj]);
n=cnt;
}
} int need[N];
double mincost[N];
int main(){
scanf("%d",&n);++n;
memset(g,0,sizeof(g));m=1;
int u,v,m0;double tmp;
for (int i=1;i<n;++i){
scanf("%lf%d",&mincost[i],&need[i]);
if (need[i])
AddEdge(n,i,mincost[i]);
}
scanf("%d",&m0);
while (m0--){
scanf("%d%d%lf",&u,&v,&tmp);
if (need[u]&&need[v]){
AddEdge(u,v,tmp);
mincost[v]=min(mincost[v],tmp);
}
}
double sum=0;
for (int i=1;i<=n;++i)
if (need[i])
sum+=mincost[i]*(need[i]-1);
printf("%.2lf\n",sum+directed_MST());
return 0;
}
bzoj4349: 最小树形图&&bzoj2260: 商店购物的更多相关文章
- bzoj2260: 商店购物 && 4349: 最小树形图
Description Grant是一个个体户老板,他经营的小店因为其丰富的优惠方案深受附近居民的青睐,生意红火.小店的优惠方案十分简单有趣.Grant规定:在一次消费过程中,如果您在本店购买了精制油 ...
- bzoj2260: 商店购物&&4349: 最小树形图
最小树形图问题啊 最小树形图是撒哩,就是给你一个有向图,确定一个根,要你到达所有点,那棵最短路径树的总边权 做这个用的是朱(jv)刘(lao)算法. 首先假如有多个联通块就无解啦 对应每个点(除了根) ...
- [JSOI2008]小店购物 & bzoj4349:最小树形图 最小树形图
---题面(洛谷)--- ---题面(bzoj)--- 其实是同一道题,,,样例都一模一样 题解: 一开始看想了好久,,,还想到了最短路和最小生成树,,然而写的时候才意识到最小生成树应该要用无向边 其 ...
- bzoj4349: 最小树形图
最小树形图模板题…… 这种\(O(nm)\)的东西真的能考到么…… #include <bits/stdc++.h> #define N 60 #define INF 1000000000 ...
- 【Bzoj2260】【Bzoj4349】商店购物 & 最小树形图
目录 List Bzoj 2260 商店购物 Description Input Output Sample Input Sample Output Bzoj 4349 最小树形图 Descripti ...
- BZOJ 2260 商店购物(最小树形图)
不会最小树形图的出门左转 其实如果确定每种商品第一件的购买顺序,那么剩下的商品肯定是以最优惠价格购买的. 如何确定各种商品第一件购买时的最小价值呢? 考虑如果购买了\(a_i\)这种商品,那么就能以\ ...
- Luogu2792 JSOI2008 小店购物 最小树形图
传送门 被题意杀 本以为一个种类的物品一定要一起买 看了题解才知道可以先把所有要买的物品买一个,剩下要买的物品就可以得到这个种类的物品能够得到的最大优惠-- 所以现在只需要知道:第一次买所有物品一遍时 ...
- 【LuoguP2792 】[JSOI2008]小店购物(最小树形图)
题目链接 题目描述 小店的优惠方案十分简单有趣: 一次消费过程中,如您在本店购买了精制油的话,您购买香皂时就可以享受2.00元/块的优惠价:如果您在本店购买了香皂的话,您购买可乐时就可以享受1.50元 ...
- hdu 4966 GGS-DDU (最小树形图)
比较好的讲解:http://blog.csdn.net/wsniyufang/article/details/6747392 view code//首先为除根之外的每个点选定一条入边,这条入边一定要是 ...
随机推荐
- zkw线段树详解
转载自:http://blog.csdn.net/qq_18455665/article/details/50989113 前言 首先说说出处: 清华大学 张昆玮(zkw) - ppt <统计的 ...
- JavaScript 各种页面跳转方法
第一种: window.location.href="login.jsp?backurl=\"+window.location.href; 第二种: alert("返回& ...
- IOS第四课——Autolayout_View
这节课,我们要学习MVC.Selector.Access Control.Extension.Auto Layout.Delegate-Protocol.Custom View. Auto Layou ...
- C语言:void指针
使用前必须进行强制类型转换 #include <stdio.h> void test(const void *p); int main(){ ; int *p = &i; puts ...
- iis 发布MVC HTTP错误 403.14
1. 在web.config增加<modules runAllManagedModulesForAllRequests="true" /> 如:问题依然不能解决.报错貌 ...
- SQL Server之游标的基础知识
什么是游标: 游标是可以在结果集中上下游动的指针. 游标的作用: --允许定位到结果集中的特定行. --从结果集的当前位置检索一行或多行数据. --支持对结果集中当前位置的行进行修改. 注意:游标虽然 ...
- PHPExcel
1.PHPExcel类中读取Excel文件相关函数和使用方法 插件官网:http://phpexcel.codeplex.com/ <?php require_once 'Classes/PHP ...
- EntityFramework 启用迁移 Enable-Migrations 报异常 "No context type was found in the assembly"
转自:http://www.cnblogs.com/stevenhqq/archive/2013/04/18/3028350.html 以前做项目的时候,没有采用分类库的形式,所以迁移一致非常顺利,没 ...
- python数字图像处理(16):霍夫圆和椭圆变换
在极坐标中,圆的表示方式为: x=x0+rcosθ y=y0+rsinθ 圆心为(x0,y0),r为半径,θ为旋转度数,值范围为0-359 如果给定圆心点和半径,则其它点是否在圆上,我们就能检测出来了 ...
- 实验三 敏捷开发与XP实践
实验内容 1. XP基础 2. XP核心实践 3. 相关工具 实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器> 课程 2.完成实验 ...