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

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

思路,建立源节点0,向每个点连边视为挖井,如果从其他村庄得到水就相当于从那个点引一条有向边过来。

 #include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
const int inf=;
int tot,In[],vis[],pre[],id[];
int X,Y,Z,n;
struct Point{
int x,y,z;
}p[];
struct edge{
int u,v,w;
}e[];
void insert(int x,int y,int z){
tot++;
e[tot].u=x;
e[tot].v=y;
e[tot].w=z;
}
int dis(Point p1,Point p2){
int ans=std::abs(p1.x-p2.x)+std::abs(p1.y-p2.y)+std::abs(p1.z-p2.z);
ans*=Y;
if (p1.z<p2.z) ans+=Z;
return ans;
}
int directedMST(int rt){
int res=;
while (){
for (int i=;i<n;i++) In[i]=inf;
for (int i=;i<=tot;i++){
int u=e[i].u,v=e[i].v;
if (u!=v&&In[v]>e[i].w) In[v]=e[i].w,pre[v]=u;
}
for (int i=;i<n;i++){
if (i==rt) continue;
if (In[i]==inf) return -;
}
int cnt=;
for (int i=;i<n;i++) vis[i]=id[i]=-;
In[rt]=;
for (int i=;i<n;i++){
res+=In[i];
int v=i;
while (vis[v]!=i&&id[v]==-&&v!=rt){
vis[v]=i;
v=pre[v];
}
if (v!=rt&&id[v]!=-){
for (int j=pre[v];j!=v;j=pre[j]){
id[j]=cnt;
}
id[v]=cnt++;
}
}
if (cnt==) return res;
for (int i=;i<n;i++) if (id[i]==-) id[i]=cnt++;
int all=;
for (int i=;i<=tot;i++){
int v=e[i].v,u=e[i].u;
e[i].u=id[u];
e[i].v=id[v];
if (e[i].u!=e[i].v)
e[i].w-=In[v],e[++all]=e[i];
}
tot=all;
n=cnt;rt=id[rt];
}
return res;
}
int main(){
while (scanf("%d%d%d%d",&n,&X,&Y,&Z)!=EOF&&n){
if (!n&&!X&&!Y&&!Z) return ;
for (int i=;i<=n;i++) scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].z);
for (int i=;i<=n;i++){
int k,x;
scanf("%d",&k);
while (k--){
scanf("%d",&x);
if (x==i) continue;
insert(i,x,dis(p[i],p[x]));
}
insert(,i,p[i].z*X);
}
n++;
int Ans=directedMST();
printf("%d\n",Ans);
}
}

HDU 4009 Transfer water的更多相关文章

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

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

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

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

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

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

  4. HDU 4009 Transfer water(最小树形图)

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

  5. HDU 4009 Transfer water 最小树形图

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

  6. HDOJ 4009 Transfer water 最小树形图

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

  7. HDU4009:Transfer water(有向图的最小生成树)

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

  8. HDU 5832 A water problem(某水题)

    p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...

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

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

随机推荐

  1. Codeforces 449D Jzzhu and Numbers

    http://codeforces.com/problemset/problem/449/D 题意:给n个数,求and起来最后为0的集合方案数有多少 思路:考虑容斥,ans=(-1)^k*num(k) ...

  2. 简要介绍如何集成Vitamio安卓版SDK

    1.下载VitamioBundle的最新稳定,这里下载的是最新版4.2.2. 2.解压缩后,导入 Vitamio 库工程(即vitamio)和Demo工程(即vitamio--sample)到 Ecl ...

  3. poj2823:单调队列入门题

    今天学习了一下单调队列这种数据结构,思想不是很难 参考资料:http://www.cnblogs.com/Jason-Damon/archive/2012/04/19/2457889.html 然后自 ...

  4. You don't have permission to access / on this server for debian_8

    Forbidden You don't have permission to access / on this server. Apache/2.4.10 (Debian) Server at www ...

  5. 使用JS截取字符串函数详解

    一.函数:split() 功能:使用一个指定的分隔符把一个字符串分割存储到数组 例子: str=”jpg|bmp|gif|ico|png”; arr=theString.split(”|”); //a ...

  6. [转]notifyDataSetChanged() 动态更新ListView

    有时候我们需要修改已经生成的列表,添加或者修改数据,notifyDataSetChanged()可以在修改适配器绑定的数组后,不用重新刷新Activity,通知Activity更新ListView.今 ...

  7. poj 3273 Monthly Expense(二分搜索之最大化最小值)

    Description Farmer John ≤ moneyi ≤ ,) that he will need to spend each day over the next N ( ≤ N ≤ ,) ...

  8. pyqt记录内容(音乐播放器)

    #这是UI文件 # -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'AudioPlayerDia ...

  9. mysql 1449 : The user specified as a definer (&#39;root&#39;@&#39;%&#39;) does not exist 解决方法

    权限问题,授权 给 root  全部sql 权限 mysql> grant all privileges on *.* to root@"%" identified by & ...

  10. 程序员的家!我终于拥有自己的blog了!!!

    经过多次提交诚恳的家园申请,终于得到了审核通过!今天就开始了我的.net成长之路!!!