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 2121 Ice_cream’s world II 不定根最小树形图
题目链接: 题目 Ice_cream's world II Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
- HDUOJ--2121--Ice_cream’s world II【朱刘算法】不定根最小树形图
链接:http://acm.hdu.edu.cn/showproblem.php? pid=2121 题意:n个顶点,m条边,求从某一点起建立有向图最小生成树而且花费最小.输出最小花费和根节点下标. ...
- hdu 4966 GGS-DDU (最小树形图)
比较好的讲解:http://blog.csdn.net/wsniyufang/article/details/6747392 view code//首先为除根之外的每个点选定一条入边,这条入边一定要是 ...
- UVA 6199 不定根最小树形图
首先是最小树形图的介绍. 看这个博客.最小树形图 上面介绍的很详细了,我就讲一下这道题的题意. 首先给出一些二维点坐标,这些坐标之间构成一些有向图,根据题意,假设两个点a(x1 ,y1) ,b(x2 ...
- HDU 4009——Transfer water——————【最小树形图、不定根】
Transfer water Time Limit:3000MS Memory Limit:65768KB 64bit IO Format:%I64d & %I64u Subm ...
- HDU 2121——Ice_cream’s world II——————【最小树形图、不定根】
Ice_cream’s world II Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64 ...
- HDU 4009 Transfer water(最小树形图)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4009 题意:给出一个村庄(x,y,z).每个村庄可以挖井或者修建水渠从其他村庄得到水.挖井有一个代价, ...
- hdu 2121 , hdu 4009 无定根最小树形图
hdu 2121 题目:给出m条有向路,根不确定,求一棵最小的有向生成树. 分析:增加一个虚拟节点,连向n个节点,费用为inf(至少比sigma(cost_edge)大).以该虚拟节点为根求一遍最小树 ...
- HDU 2121:Ice_cream’s world II(不定根的最小树形图)
题目链接 题意 求有向图的最小生成树,且根不定. 思路 最小树形图即求有向图的最小生成树,用的是朱刘算法. 这里不定根,那么可以建立一个虚根,让虚根和所有点相连,权值为一个很大的数(这里直接设为所有边 ...
随机推荐
- PL/SQL Developer 使用中文条件查询时无数据的解决方法
PL/SQL Developer 使用中文条件查询时无数据,这是由于字符集的不一致导致的. 执行以下sql命令:select userenv('language') from dual; 显示:SIM ...
- Dorado事件的参数
onClick,onSuccess 事件一般只有2个参数(self,arg),其实参数是可以添加的.可以把控件的ID直接放到参数里面来,然后在事件编辑里直接通过ID作控件对象,直接设值就好了,不要输入 ...
- 九度OJ 1163 素数
题目地址:http://ac.jobdu.com/problem.php?pid=1163 题目描述: 输入一个整数n(2<=n<=10000),要求输出所有从1到这个整数之间(不包括1和 ...
- 建造者模式(Builder Pattern)
建造者模式:使用多个简单对象一步步构建成一个复杂的对象. 有时候,我们会创建一个“复杂”的对象,这个对象的由很多子对象构成,由于需求的变化,这个对象的各个部分经常面临剧烈的变化. 继续工厂模式的披萨店 ...
- RabbitMQ远程访问配置
1 首先创建一个新的账户 并给上Administrator标签 2然后给这个新账户添加虚拟主机访问权限 3在windows 下的 rabbitmq安装文件下的etc文件下的配置文件添加以下 [ ...
- phantomjs 自动化测试
最近网站的质量检查越来越严格,原来开发过程中很多隐蔽的问题,逐渐暴露出来,为提高前端的工作效率,就想到是不是可以在开发过程中能自动的对页面的中一些规范化的东西进行自动监测,这个就可以省去不少麻烦. 整 ...
- Chrome 将默认不播放非重要 Flash 内容
Chrome 45将不再自动播放Flash,可能是45以后的版本都不自动播放了,没有具体测试. 小尺寸flash不被chrome播放,需要手动点击才能播放如何解决: <p>1.同域名fla ...
- PHP中如何设置error_reporting错误报告级别
错误报告级别:指定了在什么情况下,脚本代码中的错误(这里的错误是广义的错误,包括E_NOTICE注意.E_WARNING警告.E_ERROR致命错误等)会以错误报告的形式输出. 设置错误报告级别的 ...
- Sublime Text3快捷键一览表
选择类 Ctrl+D 选中光标所占的文本,继续操作则会选中下一个相同的文本. Alt+F3 选中文本按下快捷键,即可一次性选择全部的相同文本进行同时编辑.举个栗子:快速选中并更改所有相同的变量名.函数 ...
- Android线程池的使用(未完)
ExecutorService Executors public class Executors // 创建一个线程池,使用固定数量的线程操作共享无界队列. public static Executo ...