Transfer water

Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others)

Total Submission(s): 3775    Accepted Submission(s): 1356
Problem Description
XiaoA lives in a village. Last year flood rained the village. So they decide to move the whole village to the mountain nearby this year. There is no spring in the mountain, so each household could only dig a well or build a water
line from other household. If the household decide to dig a well, the money for the well is the height of their house multiplies X dollar per meter. If the household decide to build a water line from other household, and if the height of which supply water
is not lower than the one which get water, the money of one water line is the Manhattan distance of the two households multiplies Y dollar per meter. Or if the height of which supply water is lower than the one which get water, a water pump is needed except
the water line. Z dollar should be paid for one water pump. In addition,therelation of the households must be considered. Some households may do not allow some other households build a water line from there house. Now given the 3‐dimensional position (a, b,
c) of every household the c of which means height, can you calculate the minimal money the whole village need so that every household has water, or tell the leader if it can’t be done.
 
Input
Multiple cases.

First line of each case contains 4 integers n (1<=n<=1000), the number of the households, X (1<=X<=1000), Y (1<=Y<=1000), Z (1<=Z<=1000).


Each of the next n lines contains 3 integers a, b, c means the position of the i‐th households, none of them will exceeded 1000.


Then next n lines describe the relation between the households. The n+i+1‐th line describes the relation of the i‐th household. The line will begin with an integer k, and the next k integers are the household numbers that can build a water line from the i‐th
household.

If n=X=Y=Z=0, the input ends, and no output for that.
 
Output
One integer in one line for each case, the minimal money the whole village need so that every household has water. If the plan does not exist, print “poor XiaoA” in one line.

 
Sample Input
2 10 20 30
1 3 2
2 4 1
1 2
2 1 2
0 0 0 0
 
Sample Output
30
Hint
In 3‐dimensional space Manhattan distance of point A (x1, y1, z1) and B(x2, y2, z2) is |x2‐x1|+|y2‐y1|+|z2‐z1|.
 
Source
 

题意:给定n个点的三维坐标,以及根节点到每一个点的单向权值。再给定n个节点间相互单向连接的成本,求最小树形图。

题解:水源能够看作从虚拟根节点引出来的。这道题必然有解。由于大不了每一个实际点都跟根节点相连嘛,所以ZL_MST函数里的推断非根无入边节点能够忽略掉。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <limits.h>
#define maxn 1002
#define maxm 1000002 int X, Y, Z;
struct Node{
int x, y, z;
} ver[maxn];
struct Node2{
int u, v, cost;
} E[maxm];
int in[maxn], hash[maxn], vis[maxn], pre[maxn]; int calDist(Node a, Node b){
return abs(a.x - b.x) + abs(a.y - b.y) + abs(a.z - b.z);
} __int64 ZL_MST(int root, int nv, int ne)
{
__int64 ans = 0;
int u, v, i, cnt;
while(true){
//0.初始化
for(i = 0; i < nv; ++i) in[i] = INT_MAX;
//1.找最小入边集
for(i = 0; i < ne; ++i){
u = E[i].u; v = E[i].v;
if(E[i].cost < in[v] && u != v){
in[v] = E[i].cost; pre[v] = u;
}
}
//2.找非根无入边点(略)。由于必然有解
//3.找环。加权,又一次标号
memset(hash, -1, sizeof(hash));
memset(vis, -1, sizeof(vis));
cnt = in[root] = 0;
for(i = 0; i < nv; ++i){
ans += in[i]; v = i;
while(vis[v] != i && v != root && hash[v] == -1){
vis[v] = i; v = pre[v];
}
if(v != root && hash[v] == -1){
for(u = pre[v]; u != v; u = pre[u])
hash[u] = cnt;
hash[v] = cnt++;
}
}
if(cnt == 0) return ans; //无环,算法完毕
for(i = 0; i < nv; ++i)
if(hash[i] == -1) hash[i] = cnt++;
//4.缩点,遍历每一条边,又一次构图
for(i = 0; i < ne; ++i){
v = E[i].v;
E[i].u = hash[E[i].u];
E[i].v = hash[E[i].v];
if(E[i].u != E[i].v) E[i].cost -= in[v];
}
//顶点数降低
nv = cnt; root = hash[root];
}
return ans;
} int main()
{
int n, i, a, b, id;
while(scanf("%d%d%d%d", &n, &X, &Y, &Z) != EOF && (n||X||Y||Z)){
for(i = 0; i < n; ++i)
scanf("%d%d%d", &ver[i].x, &ver[i].y, &ver[i].z);
for(i = id = 0; i < n; ++i){
scanf("%d", &a);
while(a--){
scanf("%d", &b);
E[id].cost = calDist(ver[i], ver[--b]) * Y;
if(ver[b].z > ver[i].z) E[id].cost += Z;
E[id].u = i; E[id++].v = b;
}
}
for(i = 0; i < n; ++i){
E[id].u = n; E[id].v = i;
E[id++].cost = ver[i].z * X;
}
printf("%I64d\n", ZL_MST(n, n + 1, id));
}
return 0;
}

HDU4009 Transfer water 【最小树形图】的更多相关文章

  1. HDU4009 Transfer water —— 最小树形图 + 不定根 + 超级点

    题目链接:https://vjudge.net/problem/HDU-4009 Transfer water Time Limit: 5000/3000 MS (Java/Others)    Me ...

  2. hdu4009 Transfer water 最小树形图

    每一户人家水的来源有两种打井和从别家接水,每户人家都可能向外输送水. 打井和接水两种的付出代价都接边.设一个超级源点,每家每户打井的代价就是从该点(0)到该户人家(1~n)的边的权值.接水有两种可能, ...

  3. HDU 4009 Transfer water 最小树形图

    分析:建一个远点,往每个点连建井的价值(单向边),其它输水线按照题意建单向边 然后以源点为根的权值最小的有向树就是答案,套最小树形图模板 #include <iostream> #incl ...

  4. HDOJ 4009 Transfer water 最小树形图

    Transfer water Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others) T ...

  5. POJ 3164 Command Network 最小树形图模板

    最小树形图求的是有向图的最小生成树,跟无向图求最小生成树有很大的区别. 步骤大致如下: 1.求除了根节点以外每个节点的最小入边,记录前驱 2.判断除了根节点,是否每个节点都有入边,如果存在没有入边的点 ...

  6. HDU 4009——Transfer water——————【最小树形图、不定根】

    Transfer water Time Limit:3000MS     Memory Limit:65768KB     64bit IO Format:%I64d & %I64u Subm ...

  7. HDU 4009 Transfer water(最小树形图)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4009 题意:给出一个村庄(x,y,z).每个村庄可以挖井或者修建水渠从其他村庄得到水.挖井有一个代价, ...

  8. 最小树形图(hdu4009)

    Transfer water Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others) T ...

  9. HDU4009:Transfer water(有向图的最小生成树)

    Transfer water Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others)To ...

随机推荐

  1. MapReduce----K-均值聚类算法

    对于K-均值聚类算法MapReduce的过程理解例如以下: 如果有个Mapper,首先把数据集分为个子集,分布到个Mapper上,初始化..并同一时候广播到H个Mapper上. E步: 在第一台Map ...

  2. 48.AngularJS ng-src 指令

    转自:https://www.cnblogs.com/best/tag/Angular/ 1. <!DOCTYPE html> <html> <head> < ...

  3. 30.algorithm排序小结

    如果容器中是类,如果要调用sort则需要重载操作符 "<" 包含头文件 #define _CRT_SECURE_NO_WARNINGS #include <vector ...

  4. Ubuntu: Firefox is already running, but is not responding

    关于Ubuntu: Firefox is already running, but is not responding问题的解决办法 最近firefox总是开不开,出现“Firefox is alre ...

  5. HBase框架基础(二)

    * HBase框架基础(二) 上一节我们了解了HBase的架构原理和模块组成,这一节我们先来聊一聊HBase的读写数据的过程. * HBase的读写流程及3个机制 HBase的读数据流程: 1.HRe ...

  6. WLAN STA/AP 并发

    WLAN STA/AP 并发 Android 9 引入了可让设备同时在 STA 和 AP 模式下运行的功能.对于支持双频并发 (DBS) 的设备,此功能让一些新功能得以实现,例如在用户想要启用热点 ( ...

  7. 使用PXE+NFS EFI引导安装RHEL6/7以及Kickstart安装

    PXE引导的步骤: 1.开机后选择网络启动,client端向server端的dhcpd发起获取IP地址的dhcp请求. 2.server端分配IP后,dhcpd会同时根据其配置文件,通过TFTP协议发 ...

  8. python 异步IO

    参考链接:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143208573 ...

  9. javascript与DOM节点的结合使用

    文档对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标志语言的标准编程接口.在网页上,组织页面(或文档)的对象被组织在一个树形结构中,用来表示文档中对象 ...

  10. 洛谷 P1294 高手去散步

    P1294 高手去散步 题目背景 高手最近谈恋爱了.不过是单相思.“即使是单相思,也是完整的爱情”,高手从未放弃对它的追求.今天,这个阳光明媚的早晨,太阳从西边缓缓升起.于是它找到高手,希望在晨读开始 ...