讲一下建图过程,首先建立一个超级源点S,对于这个源点,向每个HOUSE连一条有向边,权值为该HOUSE建立WELL的费用,即高度*X。

然后每个可以连边的WELL之间,费用为曼哈顿距离*Y,然后考虑两边的高度,如果需要连接PUMB,则在该费用上+Z。

这样建图之后,以S为根,跑一遍最小树形图算法即可。

CODE:

#include <set>
#include <map>
#include <stack>
#include <cmath>
#include <queue>
#include <cstdio>
#include <string>
#include <vector>
#include <iomanip>
#include <cstring>
#include <iostream>
#include <algorithm>
#define Max 2505
#define FI first
#define SE second
#define ll long long
#define PI acos(-1.0)
#define inf 0x3fffffff
#define LL(x) ( x << 1 )
#define bug puts("here")
#define PII pair<int,int>
#define RR(x) ( x << 1 | 1 )
#define mp(a,b) make_pair(a,b)
#define mem(a,b) memset(a,b,sizeof(a))
#define REP(i,s,t) for( int i = ( s ) ; i <= ( t ) ; ++ i )using namespace std;inline void RD(int &ret) {char c;int flag = 1 ;do {c = getchar();if(c == '-')flag = -1 ;} while(c < '0' || c > '9') ;ret = c - '0';while((c=getchar()) >= '0' && c <= '9')ret = ret * 10 + ( c - '0' );ret *= flag ;
}inline void OT(int a) {if(a >= 10)OT(a / 10) ;putchar(a % 10 + '0') ;
}/*********************************************/
#define N 1005
int n , X , Y , Z ;
struct C{int x , y , z ;
}city[N] ;
int num = 0 ;
int S ;
void init(){num = S = 0 ;
}
struct kdq{int s ,e ,l ;
}E[N * N] ;
int get_Mandis(int i ,int j){return abs(city[i].x - city[j].x) + abs(city[i].y - city[j].y) + abs(city[i].z - city[j].z) ;
}
void add(int s ,int e ,int l){E[num].s = s ;E[num].e = e ;E[num].l = l ;num ++ ;
}
int pre[N] , vis[N] , id[N] , in[N] ;
int Directed_MST(int root ,int NV ,int NE){int ret = 0 ;while(1){for (int i = 0 ; i < NV ; i ++ )in[i] = inf ;for (int i = 0 ; i < NE ; i ++ ){int s = E[i].s ;int e = E[i].e ;if(in[e] > E[i].l && s != e){in[e] = E[i].l ;pre[e] = s ;}}for (int i = 0 ; i < NV ; i ++ ){if(i == root)continue ;if(in[i] == inf)return -1 ;}int cntnode = 0 ;mem(vis , -1) ;mem(id , -1) ;in[root] = 0 ;for (int i = 0 ; i < NV ; i ++ ){ret += in[i] ;int v = i ;while(vis[v] != i && id[v] == -1 && v != root){vis[v] = i ;v = pre[v] ;}if(v != root && id[v] == -1){for (int u = pre[v] ; u != v ; u = pre[u]){id[u] = cntnode ;}id[v] = cntnode ++ ;}}if(cntnode == 0)break ;for (int i = 0 ; i < NV ; i ++ )if(id[i] == -1)id[i] = cntnode ++ ;for (int i = 0 ; i < NE ; i ++ ){int s = E[i].s ;int e = E[i].e ;E[i].s = id[s] ;E[i].e = id[e] ;if(id[s] != id[e])E[i].l -= in[e] ;}NV = cntnode ;root = id[root] ;}return ret ;
}
int main() {int a , k ;while(scanf("%d%d%d%d",&n,&X,&Y,&Z) , ( n + X + Y + Z)){init() ;for (int i = 1 ; i <= n ;i ++ ){RD(city[i].x) ;RD(city[i].y) ;RD(city[i].z) ;}for (int i = 1 ; i <= n ; i ++ ){RD(k) ;while(k -- ){RD(a) ;if(i == a)continue ;//自环int dis = get_Mandis(i , a) * Y ;if(city[i].z < city[a].z)dis += Z ;add(i , a , dis) ;}}for (int i = 1 ; i <= n ; i ++ ){add(S , i , city[i].z * X) ;}int ans = Directed_MST(0 , n + 1 , num) ;if(ans == -1)puts("poor XiaoA") ;else OT(ans) ;puts("") ;}return 0 ;
}

HDU 4009 不定根最小树形图相关推荐

  1. HDU - 4966 GGS-DDU (最小树形图)

    题目大意:有一个人,想学习N个科目,每个科目都有相应的层次 有M个课程,M个课程的要求是,你的第c个科目的层次要达到l1,才可以参加,参加完这个课程后,你需要缴费money,但你的第d个科目的层次会达 ...

  2. HDU 4009 Transfer water (最小树形图+虚根)

    题意:有一个村庄需要修建供水系统.每户居民的房子都有一个三维坐标,每户居民可以选择自己挖井或者从其他居民家里引水.挖水井和引水分别需要花费不同的钱.每户居民有一个意愿表,只愿意对表内的居民家供水.最后 ...

  3. hdu 4009 Transfer water(最小树形图模板)

    题目链接:点击打开链接 Transfer water Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65768/65768 K (Ja ...

  4. hdu 2121 最小树形图 +虚根

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2121 题意: n个城市,m条单向边,每条边都有一个权值,现在要你求出这样一个节点,由这个节点出发能走遍 ...

  5. HDU 4966 GGS-DDU(最小树形图)

    n个技能,每个技能有0-a[i]的等级,m个课程,每个课程需要前置技能c[i]至少达到lv1[i]等级,效果是技能d[i]达到lv2[i]等级,花费w[i]. 输出最小花费使得全技能满级(初始全技能0 ...

  6. HDU 2121 Ice_cream’s world II (最小树形图+虚根)

    题意:有n个点(0~n-1),m条有向边,问以哪个点作为起点使得最小生成树的权值最小,如果可以构成输出权值和顶点编号,否则输出impossible. 题解:最小树形图+虚根 还好做了这题,板子有点问题 ...

  7. GGS-DDU 【HDU - 4966】【最小树形图】

    题目链接 最小树形图讲解 一道最小树形图的裸题,我们只需要对于在同一学科的由高等级逐一指向低等级的边建为0权值即可,另外的边,建立成有向边即可. #include <iostream> # ...

  8. HDU 4966 - GGS-DDU (最小树形图)

    多校综合排名前25名的学校请发送邮件到HDUACM@QQ.COM,告知转账信息(支付宝或者卡号)  GGS-DDU Time Limit: 2000/1000 MS (Java/Others)     ...

  9. NOI数据结构:最小树形图

    最小树形图-朱刘算法详解 +例题解析 最小树形图-朱刘算法详解 +例题解析_pursuit的博客-CSDN博客_最小树形图 图论 -- 生成树 -- 最小树形图 图论 -- 生成树 -- 最小树形图_ ...

  10. 【转】【最小树形图】有向图的最小生成树【朱刘算法】

    这篇文章挺好的.每行还有注释QAQ,kuangbin的模板里并没有万能节点: 万能节点好像是在不定根的时候的拓展. 要点: 1.求所有边权和sum; 2.以0点为万能节点向所有点建一条权值为sum的边 ...

最新文章

  1. deno使用rust_如何在Deno和Oak中使用MySQL
  2. WinFormsUI(转xiaisidinen)
  3. 深入理解Java:注解
  4. C语言 立方体随鼠标转动,HTML5鼠标控制的旋转的立方体
  5. 车联网 python_利用百度车联网提供的天气查询接口用python查询天气信息
  6. python的socket模块_python模块:socket模块
  7. `object.__init__`
  8. Akash Network主网现已部署Sushiswap应用
  9. .NET中加密和解密的实现方法
  10. centos6.9安装虚拟机kvm
  11. java 包装类详解_解析包装类
  12. 做好加密手机 任重而道远
  13. 联想服务器装系统不能加载硬盘,联想电脑重装系统读不出硬盘怎么办
  14. Python 他来了,他来了!
  15. CDN 缓存与浏览器缓存
  16. File 里面的flush()和close()
  17. 【数学建模】灰色预测法
  18. 记一次开发环境redis出现key丢失排查
  19. 2019年湖南电网考试备考(计算机专业第一批次)
  20. requirejs学习

热门文章

  1. 左侧固定 右侧自适应
  2. DOS命令追加符的使用
  3. HTML5笔记:跨域通讯、多线程、本地存储和多图片上传技术
  4. 如何用C#+WinRAR 实现压缩 分类:
  5. 用友U8对账不平,对账错误简单处理方法
  6. BLOB:大数据,大对象,在数据库中用来存储超长文本的数据,例如图片等
  7. 【编程开发】 C与C++中的关于函数指针的强制类型转换与指针函数的关系
  8. 使用DotNetOpenAuth搭建OAuth2.0授权框架——Demo代码简单说明
  9. 公安部4号令中关于电子邮服务器
  10. 上周热点回顾(2.25-3.3)