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. 一个使用sbt编译的JNI C++ 的模板

    假设你须要在Scala或是Java中调用C或C++函数库,就须要使用JNI. 这里就涉及到编译scala ,java 和C(C++)代码,在这里给出一个程序的框架,我们使用sbt 缺省的代码文件夹 文 ...

  2. 深入理解cookie与session

    cookie和session是web开发比較基础也比較重要的知识,cookie和session用于用户的状态管理.简单的来说它们都仅仅是http中的一个配置项,在Servlet规范中也仅仅相应一个类而 ...

  3. h5登录

    <!DOCTYPE html> <html lang="zh-cn"> <head> <meta http-equiv="Con ...

  4. iOS开发-sqlite3使用

    SQLite3使用 SQLite简介 SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中. SQLite3 在XCode工程中,打开targets,在B ...

  5. channels2.X 学习笔记

    - No module named 'asgiref.sync' 报错解决: # 报错原因: """ django版本过低, 卸载最新版本的 channels 使用2.x ...

  6. python3.x 学习笔记1(基础知识)

    1.python模块: 标准库和第三方库,第三方库需要下载安装 2.模块sys: 命令 功能 sys.stdin 标准输入流sys.stdout  标准输出流sys.stderr           ...

  7. Android属性动画-ValueAnimator和ObjectAnimator的高级用法

    ValueAnimator的高级用法 在上篇文章中介绍补间动画缺点的时候有提到过,补间动画是只能对View对象进行动画操作的.而属性动画就不再受这个限制,它可以对任意对象进行动画操作.那么大家应该还记 ...

  8. Scala之面向对象

    1. Scala基础练习 不使用str.toLong,str.toInt/Integer.valueOf()/Long.valueOf/Integer.parseInt()等,将字符串"12 ...

  9. global_step

    global_step=tf.Variable(0, trainable=False) 设定trainable=False 可以防止该变量被数据流图的 GraphKeys.TRAINABLE_VARI ...

  10. 创建vue.js项目

    vue init webpack test cd test npm install 或者 cnpm install test npm run dev