/********************************************************************************
模板题。。。问题是比赛的时候一直没看出来,以为最小费用流,Racebug用邻接矩阵敲的,
结果杯具TLE,要是用邻接表再稍微优化下的,就过了~
********************************************************************************/
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <utility>
#include <cstdio>
#include <memory>
#include <string>
#include <vector>
#include <cmath>
#include <ctime>
#include <queue>
#include <stack>
#include <map>
#include <set>
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<double, double> PDD;
typedef map<int, int>::iterator MI;
typedef vector<int>::iterator VI;
typedef set<int>::iterator SI;
const int INF_INT = 0x3f3f3f3f;
const double oo = 10e9;
const double eps = 10e-7;
const double PI = acos(-1.0);
const int MAXV = 1004;
const int MAXE = MAXV * MAXV;
struct Point
{
int x, y, z;
}pnt[MAXV];
struct Edges
{
int beg, end;
int cost;
int next;
}edges[MAXE];
int ecnt, head[MAXV];
int n, X, Y, Z;
int in[MAXV], pre[MAXV], id[MAXV], vis[MAXV];
const int src = 0;
inline int manhattan_dist(const Point &pa, const Point &pb)
{
return abs(pa.x - pb.x) + abs(pa.y - pb.y) + abs(pa.z - pb.z);
}
inline void add_edge(int u, int v, int c)
{
edges[ecnt].beg = u;
edges[ecnt].end = v;
edges[ecnt].cost = c;
edges[ecnt].next = head[u];
head[u] = ecnt++;
return ;
}
int directed_mst(int root, int vcnt)
{
int res = 0;
while (true)
{
fill(in, in + vcnt, INF_INT);
for (int i = 0; i < ecnt; ++i)
{
int u = edges[i].beg;
int v = edges[i].end;
if (edges[i].cost < in[v] && u != v)
{
pre[v] = u;
in[v] = edges[i].cost;
}
}
for (int i = 0; i < vcnt; ++i)
{
if (root == i)
{
continue ;
}
if (INF_INT == in[i])
{
return -1;
}
}
int ncnt = 0;
fill(id, id + vcnt, -1);
fill(vis, vis + vcnt, -1);
in[root] = 0;
for (int i = 0; i < vcnt; ++i)
{
res += in[i];
int v = i;
while (vis[v] != i && -1 == id[v] && v != root)
{
vis[v] = i;
v = pre[v];
}
if (v != root && -1 == id[v])
{
for (int u = pre[v]; u != v; u = pre[u])
{
id[u] = ncnt;
}
id[v] = ncnt++;
}
}
if (0 == ncnt)
{
break ;
}
for (int i = 0; i < vcnt; ++i)
{
if (-1 == id[i])
{
id[i] = ncnt++;
}
}
for (int i = 0; i < ecnt; ++i)
{
int v = edges[i].end;
edges[i].beg = id[ edges[i].beg ];
edges[i].end = id[ edges[i].end ];
if (edges[i].beg != edges[i].end)
{
edges[i].cost -= in[v];
}
}
vcnt = ncnt;
root = id[root];
}
return res;
}
void ace()
{
int k, u, v;
int ans, buf;
while (scanf("%d %d %d %d", &n, &X, &Y, &Z), n || X || Y || Z)
{
++n;
ecnt = 0;
memset(head, -1, sizeof(head));
for (int i = 1; i < n; ++i)
{
scanf("%d %d %d", &pnt[i].x, &pnt[i].y, &pnt[i].z);
}
for (u = 1; u < n; ++u)
{
add_edge(src, u, pnt[u].z * X);
}
for (u = 1; u < n; ++u)
{
scanf("%d", &k);
while (k--)
{
scanf("%d", &v);
if (v == u)
{
continue ;
}
buf = manhattan_dist(pnt[u], pnt[v]) * Y;
if (pnt[u].z < pnt[v].z)
{
buf += Z;
}
add_edge(u, v, buf);
}
}
ans = directed_mst(src, n);
if (-1 == ans)
{
puts("poor XiaoA");
}
else
{
printf("%d\n", ans);
}
}
return ;
}
int main()
{
ace();
return 0;
}相关推荐
程序员必备75道逻辑思维题(附答案)之二
逻辑训练 身为一个大数据工程师,平时的算法训练还是不能少的,今天给大家看几道我曾经看到的逻辑思维题觉得很好,想分享一下。 【6】一个球、一把长度大约是球的直径2/3长度的直尺.你怎样测出球的半径?方法很多,看看谁的比较巧妙 【7】五个大小相同的一元人民币硬币。要求两两相接触,应该怎么摆? 【8】猜牌问题 S先生、P先生、Q先生他们知道桌子的抽屉里有16张扑克牌:红桃A、Q、4 黑桃J、8、4、2、...
hdu4009Transfer water【最小树形图】
题意:居民点取水,可以自己挖井,可以从别的地方引用,但是有些边不能引用,如果引用的地点海拔高只需要买水管子的钱,引用点海拔低不仅要买泵也要买水管子的钱!!!(这里读错题了) 很明显的不定根最小树形图,既然不定根是虚拟出来一个根把它和所有点连起来,最终的结果减去这个边长就可以了,那么不定多根也是一样啊,这题加的虚边权正好是挖井的钱啊。最后就不减去那些边权了啊。所以说,图论的核心还是建边啊
微机原理与接口技术第六版周荷琴课后习题答案及解析(期末重点)
第二章 1.8086/8088CPU可直接寻址多少个内存(字节)单元?多少个I/O端口?它们的外部数据总线各有多少根? 8086/8088CPU使用的是20位地址总线,因此可以直接寻址2的20次方个内存单元(即1,048,576),每个单元大小为1字节,因此可以直接寻址2的20次方个字节的内存。 8086/8088CPU有64K个I/O端口,每个端口占用1字节的地址空间,因此可以直接寻址6...
hdu 4009 Transfer water 最小树形图
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4009 题目大意: 在山上有N户人家,每家的坐标为(xi, yi, zi)。每户人家要吃水,要么自己打井,花费为A zi,要么从别人的家引水渠代价为B 两家的曼哈顿距离,如果这家的海拔比供水的低,还要另外再买一个价值为C的水泵。问每家都有水吃的最低花费是多少。 每家都有水的目标一定能达成
ISO26262 功能安全各个阶段测试要求
1. 开发过程说明 系统层面:包括软硬件集成测试、系统集成测试以及整车测试。 硬件层面:包括硬件集成与测试。 软件层面:单元测试、集成测试。 2. 功能安全总体要求 2.1 各项指标 2.2 诊断覆盖度举例 针对一个信号举例说明: 3. 功能安全测试要求 3.1 测试计划 核心内容应包括, 测试对象:需要测试的对象描述,以及测试的范围描...
Python全栈入门到实战【JavaScript篇 15】async/await与Fetch API,打通前后端数据通道
Fetch API是浏览器内置的现代HTTP请求接口,用于向服务器发送请求并获取响应。它是(XHR)的替代品。学习Fetch的目标非常明确——用JS从后端API获取数据,并渲染到前端页面。这标志着前后端数据通道的打通,是实现全栈开发的核心技能。try {// 等待Promiseconst parallel = await Promise.all([ // 并行等待]);
HDU 4009 无定根最小树形图(依据题意建根)
HDU 4009 给出3维的点,由每个点的信息建立一个有向图,然后求出最小树形图 建图方法:先把每个点的信息存着.根据每个点指向的另一个点的高度来建边, p[i].z >= p[to].z,就不需要水泵 p[i].z < p[to].z,加上一个水泵 题目告诉可以挖井是什么意思? 题目也没有给出有向图的原点,我们又需要建一个虚根作为原点. 那么可以将所有井的底部都抽象成虚...
自动化控制软件:Beckhoff TwinCAT二次开发_(7).HMI开发基础
TwinCAT HMI是Beckhoff公司为TwinCAT自动化平台开发的专用HMI软件。Web技术基础:基于Web技术,支持HTML5、CSS3和JavaScript,可以轻松集成第三方库和框架。多平台支持:可以在多种设备上运行,包括PC、平板电脑和智能手机。高效开发:提供丰富的组件库和开发工具,简化开发过程。安全性:支持多种安全机制,确保数据和系统的安全性。可扩展性:支持自定义组件和脚本,满足不同应用场景的需求。Button:按钮组件,用于触发操作。Label:标签组件,用于显示文本信息。
HDU 4009 Transfer water(无固定根最小树形图)
题目链接: HDU 4009 Transfer water 题意: 需要给n户人家通水。给出每户人家的三维坐标,每户人家自建一口井的花费是X,对于每户人家给出k[i]条边,to[j],表示可以从第u=i户人家铺设一条水管道到第v=to[j]户人家,铺设的费用是两户人家三维坐标之差的绝对值之和*Y,如果u的高度小于v的高度还需要额外加上Z花费。问将n户人家都通上水的最小花费是多少?如果不能使每户
milvus | 第 1 章:从“相似图片搜索”理解 Milvus 向量数据库
本文介绍了向量数据库Milvus的核心概念和基本架构。主要内容包括:1)向量数据库解决的是高维向量相似度检索问题,通过Embedding将非结构化数据转换为向量进行比较;2)Milvus作为分布式向量数据库,包含Proxy、Coordinator、QueryNode等多个组件协同工作;3)关键概念如Collection、Schema、Segment等构成了Milvus的数据组织方式;4)典型使用流程包括创建集合、插入数据、构建索引、加载数据和执行搜索五个步骤。文章为后续深入理解Milvus源码提供了基础知识
【Python】解决 ERROR: Exception:Traceback (most recent call last):(亲测有效)
1、遇到问题2、问题解决
HDU - 4009-Transfer water (最小树形图)
题目链接:HDU - 4009-Transfer water最小树形图模板。 二重循环下标写同样的WA了好久。。。#include<bits/stdc++.h> using namespace std; int n,x,y,z,m; const int maxn=1007; const int INF=2e9+7; struct Edge{ int u,v; int d; }; E
Ollama教程——模型:如何将模型高效导入到ollama框架
本教程详细介绍了如何将GGUF、PyTorch和Safetensors格式的模型导入到ollama框架中。通过一系列步骤,从环境准备、模型转换和量化,到最终的模型创建和运行,我们为开发者提供了一个清晰的指南。此外,我们还探讨了如何发布模型到ollama平台,使得模型可以被更广泛地分享和应用。ollama框架提供了一个灵活、高效的解决方案,帮助开发者在各种环境中部署和运行机器学习模型。无论您是想将现有模型快速部署到生产环境,还是希望探索新的模型架构,ollama都能为您提供所需的工具和资源。
HDU 4009 Transfer water 朱刘算法求无固定根最小树形图
题目链接:HDU 4009 分析:和
Camera2Demo
在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作
VB摄像头监控
该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制
HDU4009 Transfer water【最小树形图算法详解】
最小树形图 最小树形图实际上可以理解为有向图的最小生成树,它满足这样的要求: 1、不存在环; 2、除根结点的入度为0,其他点的入度都为1; 3、满足1和2的条件的所有子图中权值和最小; 朱刘算法的基本思想 每次找最小入边集,如果有环或不连通,环缩点重新建图再继续重复; 0、初始化:每个点入边最小权值初始化为极大值; 1、找最小入边集:就是找到每一个点所有入边里权值最小的那个,并记录...
汉书HE8,好用的汇编代码编写工具
汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大
HDU4009 Transfer water 最小树形图
最小树形图=有向图最小生成树 裸地朱刘算法 Transfer water Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others) Total Submission(s): 2925 Accepted Submission(s): 1095
jdk-8u144-linux-x64.tar.gz.
该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包
hdu 2121 , hdu 4009 无定根最小树形图
hdu 2121 题目:给出m条有向路,根不确定,求一棵最小的有向生成树。 分析:增加一个虚拟节点,连向n个节点,费用为inf(至少比sigma(cost_edge)大)。以该虚拟节点为根求一遍最小树形图算法,这时肯定存在解,如果费用>=inf时,说明无解。这是因为sigma(cost_edge)<inf。如何求得根?在寻找前驱时发现为根,则更新一下那条边的边号即可。 hd...
HDU 4009 最小树形图
题意:有一个村庄需要给每户人家提供水,有两个方法:1.自己凿井 2.从有井的人家引过来,不同的方式有不同的花费,问你解决每户人家供水问题的最小花费。 思路:构建一个超级源点,丛源点引一条边到每个点(花费为 home.z * X)),可以引水的两个人家间构建一条边,然后对超级源点跑一次最小树形图即可(引用HH大牛的模板)。 总结:这个题目如果不是看了最小树形图的专题的话,目测我是没有能力做
[HDU 4009] Transfer water (最小树形图)
题目链接:
HDU 4009 Transfer water (最小树形图+虚根)
题意:有一个村庄需要修建供水系统。每户居民的房子都有一个三维坐标,每户居民可以选择自己挖井或者从其他居民家里引水。挖水井和引水分别需要花费不同的钱。每户居民有一个意愿表,只愿意对表内的居民家供水。最后要求计算出能为所有居民供水的最小花费。 题解:最小树形图+虚根 建一个虚根,将虚根连向所有点,边权为那个点自己挖井需要的费用。 其他按照居民意愿建边,跑朱刘。 数组开小了居然超时。 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include
hdu4009 Transfer water(最小树形图模板)
题目链接:点击打开链接 题意描述:在一个村庄有n户人家(x,y,h),现在打算在村庄中挖井和建水渠使每户人家都可以用上水 1、如果挖井费用为高度h*X; 2、如果a->b建水渠,if(a.h>=b.h)费用为两点距离dis*Y,反之费用为dis*Y+Z 问,怎样挖井和建水渠才能使费用最小? 解体思路:最小树形图:点击打开链接 分析:我们可以新建一个源点指向所有的用户,权值为挖井
HDU 4009 Transfer water 最小树形图
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4009 题意:山上有n户人,均给出三维坐标,这n户人要吃水,可以挖井,花费为所处高度 * X,从别人家引水,若水源处不低于当前人家,那么为两户人的曼哈顿距离 * Y,若低于则额外加上一个水泵的费用Z,然后只有给定的家庭之间才能引水,问能使所有人都用到水的最小花费 思路:无定根最小树形图。定0为虚拟根,从
HDU 4009 最小树形图裸题
题意: n个点 X Y Z (点标从1开始) 下面n个点的坐标(三维) 下面第i行表示i点能向 u 点引流 给定n个村要用水 1、自己打井,花费:坐标的高度*X 2、从有井的村落引流,花费:曼哈顿距离*Y (若水是往高处流的,还要花费Z购买水泵) 3、假设开始时所有村落没有任何井和管道 问: 若大家都能用上水则输出最小花费,否则输出poor XiaoA 思路: 因为引流一定要
HDU 4009 不定根最小树形图
讲一下建图过程,首先建立一个超级源点S,对于这个源点,向每个HOUSE连一条有向边,权值为该HOUSE建立WELL的费用,即高度*X。 然后每个可以连边的WELL之间,费用为曼哈顿距离*Y,然后考虑两边的高度,如果需要连接PUMB,则在该费用上+Z。 这样建图之后,以S为根,跑一遍最小树形图算法即可。 CODE: #include <set> #include <...
Transfer water 【HDU - 4009】【最小树形图】
题目链接 关于最小树形图的详细讲解 挺好的一道最小树形图,然后也卡了时间,让我知道了,每次更新,缩环成点的时候,再次遍历的时候,相同的点就不要管了,即使它们之间有边,也不需要了,反正就是环内的点,已经看成了一个点,不是吗?然后解决完这个问题之后WA了几发!我的天,为什么就WA!?然后找了半天BUG,没什么问题啊,然后在看,试了下改变判断的条件,如果它们是等高的,也要+Z的话!竟然是这样,A...
最小树形图(hdu4009)
Transfer water Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others) Total Submission(s): 3821 Accepted Submission(s): 1371 Problem Description XiaoA lives in
3547



被折叠的 条评论
为什么被折叠?



