HDU 4009 不定根最小树形图
讲一下建图过程,首先建立一个超级源点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 不定根最小树形图相关推荐
- HDU - 4966 GGS-DDU (最小树形图)
题目大意:有一个人,想学习N个科目,每个科目都有相应的层次 有M个课程,M个课程的要求是,你的第c个科目的层次要达到l1,才可以参加,参加完这个课程后,你需要缴费money,但你的第d个科目的层次会达 ...
- HDU 4009 Transfer water (最小树形图+虚根)
题意:有一个村庄需要修建供水系统.每户居民的房子都有一个三维坐标,每户居民可以选择自己挖井或者从其他居民家里引水.挖水井和引水分别需要花费不同的钱.每户居民有一个意愿表,只愿意对表内的居民家供水.最后 ...
- hdu 4009 Transfer water(最小树形图模板)
题目链接:点击打开链接 Transfer water Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65768/65768 K (Ja ...
- hdu 2121 最小树形图 +虚根
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2121 题意: n个城市,m条单向边,每条边都有一个权值,现在要你求出这样一个节点,由这个节点出发能走遍 ...
- HDU 4966 GGS-DDU(最小树形图)
n个技能,每个技能有0-a[i]的等级,m个课程,每个课程需要前置技能c[i]至少达到lv1[i]等级,效果是技能d[i]达到lv2[i]等级,花费w[i]. 输出最小花费使得全技能满级(初始全技能0 ...
- HDU 2121 Ice_cream’s world II (最小树形图+虚根)
题意:有n个点(0~n-1),m条有向边,问以哪个点作为起点使得最小生成树的权值最小,如果可以构成输出权值和顶点编号,否则输出impossible. 题解:最小树形图+虚根 还好做了这题,板子有点问题 ...
- GGS-DDU 【HDU - 4966】【最小树形图】
题目链接 最小树形图讲解 一道最小树形图的裸题,我们只需要对于在同一学科的由高等级逐一指向低等级的边建为0权值即可,另外的边,建立成有向边即可. #include <iostream> # ...
- HDU 4966 - GGS-DDU (最小树形图)
多校综合排名前25名的学校请发送邮件到HDUACM@QQ.COM,告知转账信息(支付宝或者卡号) GGS-DDU Time Limit: 2000/1000 MS (Java/Others) ...
- NOI数据结构:最小树形图
最小树形图-朱刘算法详解 +例题解析 最小树形图-朱刘算法详解 +例题解析_pursuit的博客-CSDN博客_最小树形图 图论 -- 生成树 -- 最小树形图 图论 -- 生成树 -- 最小树形图_ ...
- 【转】【最小树形图】有向图的最小生成树【朱刘算法】
这篇文章挺好的.每行还有注释QAQ,kuangbin的模板里并没有万能节点: 万能节点好像是在不定根的时候的拓展. 要点: 1.求所有边权和sum; 2.以0点为万能节点向所有点建一条权值为sum的边 ...
最新文章
- deno使用rust_如何在Deno和Oak中使用MySQL
- WinFormsUI(转xiaisidinen)
- 深入理解Java:注解
- C语言 立方体随鼠标转动,HTML5鼠标控制的旋转的立方体
- 车联网 python_利用百度车联网提供的天气查询接口用python查询天气信息
- python的socket模块_python模块:socket模块
- `object.__init__`
- Akash Network主网现已部署Sushiswap应用
- .NET中加密和解密的实现方法
- centos6.9安装虚拟机kvm
- java 包装类详解_解析包装类
- 做好加密手机 任重而道远
- 联想服务器装系统不能加载硬盘,联想电脑重装系统读不出硬盘怎么办
- Python 他来了,他来了!
- CDN 缓存与浏览器缓存
- File 里面的flush()和close()
- 【数学建模】灰色预测法
- 记一次开发环境redis出现key丢失排查
- 2019年湖南电网考试备考(计算机专业第一批次)
- requirejs学习