题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4349.

学习博客:http://www.cnblogs.com/xzxl/p/7243466.html

关于这道题,图的边权不是 代价*次数 , 而就是一次的代价,因为只要考虑每个堡垒第一次以什么代价被打,之后都可以用最低代价打它。

注意 “不需要攻打” 的堡垒。注意重连边的时候把边的端点改成新的标号。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define db double
using namespace std;
const int N=,M=; const db INF=1e6;
int n,b[N];db a[N],mn[N]; bool ok[N];
namespace DMST{
int xnt,pre[N],id[N],vis[N]; db in[N];
struct Ed{
int x,y; db w;
Ed(int x=,int y=,db w=):x(x),y(y),w(w) {}
}ed[M];
void add(int x,int y,db z){ ed[++xnt]=Ed(x,y,z); }
db solve(int V,int E)
{
db ret=;
while()
{
for(int i=;i<=V;i++)in[i]=INF,id[i]=vis[i]=;
for(int i=,u,v;i<=E;i++)
{
u=ed[i].x; v=ed[i].y;
if(in[v]>ed[i].w)in[v]=ed[i].w, pre[v]=u;
}
for(int i=;i<=V;i++)
{ if(in[i]==INF)return -; ret+=in[i];}
int cnt=;
for(int i=;i<=V;i++)
{
vis[i]=i; int cr=pre[i];
while(cr&&!vis[cr]) vis[cr]=i, cr=pre[cr];
if(vis[cr]==i)
{
id[cr]=++cnt; cr=pre[cr];
while(!id[cr])id[cr]=cnt, cr=pre[cr];
}
}
if(!cnt)return ret;
for(int i=;i<=V;i++)if(!id[i])id[i]=++cnt;
V=cnt; int tE=E; E=;
for(int i=,u,v;i<=tE;i++)
{
u=ed[i].x; v=ed[i].y;
if(id[u]==id[v])continue;
ed[++E].x=id[u]; ed[E].y=id[v];//id[]
ed[E].w=ed[i].w-in[v];
}
}
}
}
int main()
{
int tn;scanf("%d",&tn);
for(int i=;i<=tn;i++)
{
scanf("%lf%d",&a[i],&b[i]);
if(!b[i]){ ok[i]=;continue;}
DMST::id[i]=++n; DMST::add(,DMST::id[i],a[i]);
}
int m; db d; scanf("%d",&m);
for(int i=,u,v;i<=m;i++)
{
scanf("%d%d%lf",&u,&v,&d);
if(ok[u]||ok[v])continue;
DMST::add(DMST::id[u],DMST::id[v],d);
a[v]=min(a[v],d);
}
db ans=DMST::solve(n,DMST::xnt);
for(int i=;i<=tn;i++)//tn
if(!ok[i])ans+=(b[i]-)*a[i];
printf("%.2f\n",ans);
return ;
}

bzoj 4349 最小树形图——朱刘算法的更多相关文章

  1. 最小树形图——朱刘算法(Edmonds)

    定义:一个有向图,存在从某个点为根的,可以到达所有点的一个最小生成树,则它就是最小树形图. 朱刘算法实现过程: [在选出入边集后(看步骤1),若有向图中不存在有向环,说明该图就是最小树形图] 1,选入 ...

  2. POJ 3164 Command Network ( 最小树形图 朱刘算法)

    题目链接 Description After a long lasting war on words, a war on arms finally breaks out between littlek ...

  3. poj3164(最小树形图&朱刘算法模板)

    题目链接:http://poj.org/problem?id=3164 题意:第一行为n, m,接下来n行为n个点的二维坐标, 再接下来m行每行输入两个数u, v,表点u到点v是单向可达的,求这个有向 ...

  4. POJ 3164 Command Network 最小树形图 朱刘算法

    =============== 分割线之下摘自Sasuke_SCUT的blog============= 最 小树形图,就是给有向带权图中指定一个特殊的点root,求一棵以root为根的有向生成树T, ...

  5. 最小树形图--朱刘算法([JSOI2008]小店购物)

    题面 luogu Sol 首先设一个 \(0\) 号点,向所有点连边,表示初始价值 显然这个图的一个 \(0\) 为根的最小有向生成树的边权和就是每个买一次的最小价值 再买就一定能优惠(包含 \(0\ ...

  6. 洛谷P4716 【模板】最小树形图(朱刘算法)

    题意 题目链接 Sol 朱刘算法?感觉又是一种神仙贪心算法 大概就是每次贪心的用每个点边权最小的入边更新答案,如果不行的话就缩起来找其他的边 不详细说了,丢链接走人.. #include<bit ...

  7. POJ - 3164-Command Network 最小树形图——朱刘算法

    POJ - 3164 题意: 一个有向图,存在从某个点为根的,可以到达所有点的一个最小生成树,则它就是最小树形图. 题目就是求这个最小的树形图. 参考资料:https://blog.csdn.net/ ...

  8. 【刷题】BZOJ 4349 最小树形图

    Description 小C现在正要攻打科学馆腹地------计算机第三机房.而信息组的同学们已经建好了一座座堡垒,准备迎战.小C作为一种高度智慧的可怕生物,早已对同学们的信息了如指掌. 攻打每一个人 ...

  9. poj 3164 Command Network (朱刘算法)

    题目链接: http://poj.org/problem?id=3164 题目大意: 有n个点(用坐标表示)各点编号分别为1—>n,m条单向路,问能否存在一个花费价值最小的网络,能使从1点到达任 ...

随机推荐

  1. 20165214 实验三 敏捷开发与XP实践

    一.实验报告封面 课程:Java程序设计 班级:1652班 姓名:朱文远 学号:20165214 指导教师:娄嘉鹏 实验日期:2018年4月28日 实验时间:15:35 - 17:15 实验序号:三 ...

  2. 关于 global nonlocal 用法

    # 1 关于 globals() locals() nolocl 还有内置函数的引用## 概念的解释# 命名空间# 1 局部命名空间:每一个函数都有自己的命名空间# 2 全局命名空间:写在函数外的变量 ...

  3. LVS原理详解(3种工作方式8种调度算法)

    一.集群简介 什么是集群 计算机集群简称集群是一种计算机系统,它通过一组松散集成的计算机软件和/或硬件连接起来高度紧密地协作完成计算工作.在某种意义上,他们可以被看作是一台计算机.集群系统中的单个计算 ...

  4. ios UITableView背景图片设置

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPa ...

  5. 4-log4j2之切分日志文件

    一.添加maven依赖 <dependencies> <dependency> <groupId>org.apache.logging.log4j</grou ...

  6. 简短而有效的python queue队列解释

    Queue.qsize() 返回队列的大小  Queue.empty() 如果队列为空,返回True,反之False  Queue.full() 如果队列满了,返回True,反之False Queue ...

  7. logging 模块 五星知识

    logging 是用来记录日志的,有下面5种模式,它和print功能一样,只不过,print不能控制自己打印的内容,而logging可以控制,你想打印什么东西. logging 有两种形式: 第一种: ...

  8. sqlite 3基本使用方法

    1.sqlite数据库数据类型 Integer 整型 varchar(10) 字符数组 float 浮点型 double 双精度浮点型 char(10) 字符型 text 文本型 2.sql语法 2. ...

  9. 读懂TCP状态转移

    读懂TCP状态转移过程,对理解网络编程颇有帮助,本文将对TCP状态转移过程进行介绍,但各状态(总共11个)含义不在本文介绍的范围,请参考文末的书目列表. TCP状态转换图(state transiti ...

  10. Java中的break和continue以及标签

    一.Java中的break,continue,goto 首先break,continue是Java中的关键字,而goto是保留字. 基于goto在c和c++中的鬼畜表现,我觉得goto可能还会长期在J ...