HDU 4009 Transfer water
题目链接: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的更多相关文章
- HDU 4009——Transfer water——————【最小树形图、不定根】
Transfer water Time Limit:3000MS Memory Limit:65768KB 64bit IO Format:%I64d & %I64u Subm ...
- hdu 4009 Transfer water(最小型树图)
Transfer water Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others)To ...
- HDU - 4009 - Transfer water 朱刘算法 +建立虚拟节点
HDU - 4009:http://acm.hdu.edu.cn/showproblem.php?pid=4009 题意: 有n户人家住在山上,现在每户人家(x,y,z)都要解决供水的问题,他可以自己 ...
- HDU 4009 Transfer water(最小树形图)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4009 题意:给出一个村庄(x,y,z).每个村庄可以挖井或者修建水渠从其他村庄得到水.挖井有一个代价, ...
- HDU 4009 Transfer water 最小树形图
分析:建一个远点,往每个点连建井的价值(单向边),其它输水线按照题意建单向边 然后以源点为根的权值最小的有向树就是答案,套最小树形图模板 #include <iostream> #incl ...
- HDOJ 4009 Transfer water 最小树形图
Transfer water Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others) T ...
- HDU4009:Transfer water(有向图的最小生成树)
Transfer water Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others)To ...
- HDU 5832 A water problem(某水题)
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
- hdu 2121 , hdu 4009 无定根最小树形图
hdu 2121 题目:给出m条有向路,根不确定,求一棵最小的有向生成树. 分析:增加一个虚拟节点,连向n个节点,费用为inf(至少比sigma(cost_edge)大).以该虚拟节点为根求一遍最小树 ...
随机推荐
- Codeforces 219D Choosing Capital for Treeland
http://codeforces.com/problemset/problem/219/D 题目大意: 给出一棵树,但是它的边是有向边,选择一个城市,问最少调整多少条边的方向能使一个选中城市可以到达 ...
- 在docker以FPM-PHP运行php,慢日志导致的BUG分析
问题描述: 最近将IOS书城容器化,切换流量后.正常的业务测试了一般,都没发现问题.线上的错误监控系统也没有报警,以为迁移工作又告一段落了,暗暗的松了一口气.紧接着,报警邮件来了,查看发现是一个苹果支 ...
- zabbix 启用分区表后需要关闭Housekeeper
<pre name="code" class="html">Zabbix Housekeeper changes: 使用分区表需要关闭zabbix的 ...
- OpenJTAG+Eclipse 3.5+GDB+Mini2440图文教程
OpenJTAG+Eclipse 3.5+GDB+Mini2440图文教程 OpenJTAG与JLink的区别比较: 相同点:都同时具备USB转JTAG.USB转串口功能 差别: 1. 操作系统: O ...
- Delphi动态调用Java的WebService 转
Delphi动态调用Java的WebService —— 基于“Axis2发布WebService例子(HelloWorld)” uses ComObj; var WsObject: Variant; ...
- 使用kthread内核线程的内核模块
这里使用了msleep(50); printk 开启其实挺大的,当我使用msleep(10);机器直接卡死了: 另外ISERR不能判断结构体的,只能判断 空指针 #cat hello.c #inclu ...
- C# - List操作- 去掉重复
ChangeList里面会有重复的数据,这时可以这样去掉重复的item // Remove duplicated info var dup = ChangeList.Where(item => ...
- 解决selenium 启动ie浏览器报错:Unexpected error launching Internet Explorer. Protected Mode settings are not the same for all zones
启动ie代码: System.setProperty("webdriver.ie.driver", "bin/IEDriverServer.exe"); Web ...
- Ubuntu下访问SSH
ssh程序分为有客户端程序openssh-client和服务端程序openssh-server.如果需要ssh登陆到别的电脑,需要安装openssh-client,该程序ubuntu是默认安装的.而如 ...
- [转]Spring Boot——2分钟构建spring web mvc REST风格HelloWorld
Spring Boot——2分钟构建spring web mvc REST风格HelloWorld http://projects.spring.io/spring-boot/ http://spri ...