题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4009

题意:给出一个村庄(x,y,z)。每个村庄可以挖井或者修建水渠从其他村庄得到水。挖井有一个代价,修水渠有一个代价。另外A村庄只能向其指定的一些村庄供水。使得所有村庄有水求最小代价。

思路:增加虚拟点0,向所有点连边表示挖井。能连边的连边。求最小树形图即可。

struct point
{
int x,y,z;
}; struct edge
{
int u,v,w;
}; point p[N];
edge e[N*N];
int eCnt,n,pre[N],id[N],in[N],visit[N]; void add(int u,int v,int w)
{
e[eCnt].u=u;
e[eCnt].v=v;
e[eCnt++].w=w;
} int directedMST(int root)
{
int ans=0,nv=n,i;
while(1)
{
for(i=0;i<nv;i++) in[i]=INF;
for(i=0;i<eCnt;i++)
{
int u=e[i].u;
int v=e[i].v;
if(u!=v&&e[i].w<in[v])
{
in[v]=e[i].w;
pre[v]=u;
}
}
for(i=0;i<nv;i++)
{
if(i!=root&&inf==in[i]) return -1;
}
int nodeCnt=0;
for(i=0;i<nv;i++) id[i]=visit[i]=-1;
in[root]=0;
for(i=0;i<nv;i++)
{
ans+=in[i];
int v=i;
while(visit[v]!=i&&id[v]==-1&&v!=root)
{
visit[v]=i;
v=pre[v];
}
if(v!=root&&-1==id[v])
{
int u;
for(u=pre[v];u!=v;u=pre[u]) id[u]=nodeCnt;
id[v]=nodeCnt++;
}
}
if(0==nodeCnt) break;
for(i=0;i<nv;i++) if(-1==id[i]) id[i]=nodeCnt++;
for(i=0;i<eCnt;i++)
{
int v=e[i].v;
e[i].u=id[e[i].u];
e[i].v=id[e[i].v];
if(e[i].u!=e[i].v) e[i].w-=in[v];
}
nv=nodeCnt;
root=id[root];
}
return ans;
} int X,Y,Z; int Dis(point a,point b)
{
int dis=abs(a.x-b.x)+abs(a.y-b.y)+abs(a.z-b.z);
dis*=Y;
if(a.z<b.z) dis+=Z;
return dis;
} int main()
{
while(scanf("%d%d%d%d",&n,&X,&Y,&Z)!=EOF)
{
if(!n&&!X&&!Y&&!Z) break;
int i,j,u,v;
n++;
for(i=1;i<n;i++) scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].z);
eCnt=0;
for(i=1;i<n;i++)
{
int k;
scanf("%d",&k);
while(k--)
{
int t;
scanf("%d",&t);
if(t==i) continue;
add(i,t,Dis(p[i],p[t]));
}
add(0,i,p[i].z*X);
}
printf("%d\n",directedMST(0));
}
return 0;
}

HDU 4009 Transfer water(最小树形图)的更多相关文章

  1. HDU 4009 Transfer water 最小树形图

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

  2. HDOJ 4009 Transfer water 最小树形图

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

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

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

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

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

  5. HDU - 4009 - Transfer water 朱刘算法 +建立虚拟节点

    HDU - 4009:http://acm.hdu.edu.cn/showproblem.php?pid=4009 题意: 有n户人家住在山上,现在每户人家(x,y,z)都要解决供水的问题,他可以自己 ...

  6. hdu 2121 , hdu 4009 无定根最小树形图

    hdu 2121 题目:给出m条有向路,根不确定,求一棵最小的有向生成树. 分析:增加一个虚拟节点,连向n个节点,费用为inf(至少比sigma(cost_edge)大).以该虚拟节点为根求一遍最小树 ...

  7. hdu 4009 Transfer water(最小型树图)

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

  8. hdu4009 Transfer water 最小树形图

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

  9. HDU 4009 Transfer water

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

随机推荐

  1. es6声明一个类

    js语言的传统方式是通过定义构造函数,生成心得对象.是一种基于原型的面向对象系统.在es6中增加了class类的概念,可以使用class关键字来声明一个类.之后用这个类来实例化对象. 构造函数示例 c ...

  2. CSS的选择器分为两大类

    CSS的选择器分为两大类:基本选择题和扩展选择器. 基本选择器: 标签选择器:针对一类标签 ID选择器:针对某一个特定的标签使用 类选择器:针对你想要的所有标签使用 通用选择器(通配符):针对所有的标 ...

  3. Vue里面提供的三大类钩子及两种函数

    在路由跳转的时候,我们需要一些权限判断或者其他操作.这个时候就需要使用路由的钩子函数. 定义:路由钩子主要是给使用者在路由发生变化时进行一些特殊的处理而定义的函数. 总体来讲vue里面提供了三大类钩子 ...

  4. 浅谈C++三种传参方式

    浅谈C++三种传参方式 C++给函数传参中,主要有三种方式:分别是值传递.指针传递和引用传递. 下面通过讲解和实例来说明三种方式的区别. 值传递 我们都知道,在函数定义括号中的参数是形参,是给函数内专 ...

  5. github的学习使用以及将自己开发的app传上去。

    主要参考的网址如下: https://www.cnblogs.com/sdcs/p/8270029.html https://www.cnblogs.com/sjhsszl/p/8708471.htm ...

  6. Django常用的第三方包

    Django常用的第三方包 API开发 djangorestframework django-rest-multiple-models django-cors-headers 查询 django-fi ...

  7. Linux基础篇,磁盘及文件使用管理

    在windows系统下,我们可以使用图形化界面很明了的看出当前硬盘使用量与某个文件的占用空间大小和文件数量.但是在linux系统中,我们应该如何得到这些信息呢? 当然是功能强大的df与du了. 一.d ...

  8. c++容器的底层数据结构

    序列式容器 vector ->底层数据结构为数组,支持快速随机访问 list ->底层数据结构为双向链表,支持快速增加和删除 deque ->底层数据结构为一个中央控制器和多个缓冲区 ...

  9. excel完成数据库数据的批量插入

    业务场景: 开发过程中往往会遇到这样情况就是产品直接给我们一堆数据,让咱们直接导入到后台数据库中,这时候咱们只需要在excel表中进行直接操作即可,如图所示(以河北省的编号为例): 而对应的数据表为: ...

  10. 使用pandas读取csv文件和写入文件

    这是我的CSV文件 读取其中得tempo这一列 import pandas as pd #导入pandas包 data = pd.read_csv("E:\\毕设\\情感识别\\Music- ...