多建一个根,连到每一个点,然后花费是建水井的钱

然后跑一边最小树形图即可,这题必定有解,因为可以从根开始到每一点,可以不用判无解的情况

#include<map>
#include<set>
#include<ctime>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<cstdio>
#include<iomanip>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define pi acos(-1)
#define ll long long
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#define MIN(a,b) a<b ? a:b using namespace std; const double g=10.0,eps=1e-;
const int N=+,maxn=+,inf=0x3f3f3f3f; struct edge{
int u,v,w;
}e[maxn];
struct pe{
int x,y,z;
}p[N];
int pre[N],in[N],vis[N];
int ans,Hash[N];
int dis(int a,int b)
{
return abs(p[a].x-p[b].x)+abs(p[a].y-p[b].y)+abs(p[a].z-p[b].z);
}
bool dirmst(int root,int nv,int ne)
{
ans=;
while(){
memset(in,inf,sizeof in);
for(int i=;i<ne;i++)
{
int u=e[i].u,v=e[i].v;
if(e[i].w<in[v]&&u!=v)
{
in[v]=e[i].w;
pre[v]=u;
}
}
in[root]=;
for(int i=;i<nv;i++)
if(in[i]==inf)
return ;
int cntnum=;
memset(vis,-,sizeof vis);
memset(Hash,-,sizeof Hash);
for(int i=;i<nv;i++)
{
ans+=in[i];
int v=i;
while(vis[v]!=i&&v!=root&Hash[v]==-)vis[v]=i,v=pre[v];
if(v!=root&&Hash[v]==-)
{
for(int u=pre[v];u!=v;u=pre[u])
Hash[u]=cntnum;
Hash[v]=cntnum++;
}
}
if(cntnum==)return ;
for(int i=;i<nv;i++)
if(Hash[i]==-)
Hash[i]=cntnum++;
for(int i=;i<ne;i++)
{
int v=e[i].v;
e[i].v=Hash[e[i].v];
e[i].u=Hash[e[i].u];
if(e[i].v!=e[i].u)e[i].w-=in[v];
}
nv=cntnum;
root=Hash[root];
}
return ;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie();
int n,x,y,z;
while(cin>>n>>x>>y>>z){
if(n==&&x==&&y==&&z==)break;
for(int i=;i<=n;i++)cin>>p[i].x>>p[i].y>>p[i].z;
int cnt=;
for(int i=;i<=n;i++)
{
int k,s;
cin>>k;
while(k--){
cin>>s;
e[cnt].u=i;
e[cnt].v=s;
e[cnt].w=dis(i,s)*y;
if(p[s].z>p[i].z)e[cnt].w+=z;
cnt++;
}
}
for(int i=;i<=n;i++)
{
e[cnt].u=;
e[cnt].v=i;
e[cnt].w=x*p[i].z;
cnt++;
}
dirmst(,n+,cnt))
cout<<ans<<endl;
}
return ;
}

hdu4009最小树形图的更多相关文章

  1. hdu4009最小树形图板子题

    /*调了一下午的最小树形图,昨天刚刚看懂模板..最小树形图,就是有向图的最小生成树,很神奇==*/ #include<iostream> #include<cstring> # ...

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

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

  3. 最小树形图(hdu4009)

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

  4. hdu4009 Transfer water 最小树形图

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

  5. HDU4009 Transfer water 【最小树形图】

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

  6. POJ 3164 Command Network 最小树形图模板

    最小树形图求的是有向图的最小生成树,跟无向图求最小生成树有很大的区别. 步骤大致如下: 1.求除了根节点以外每个节点的最小入边,记录前驱 2.判断除了根节点,是否每个节点都有入边,如果存在没有入边的点 ...

  7. 树的问题小结(最小生成树、次小生成树、最小树形图、LCA、最小支配集、最小点覆盖、最大独立集)

    树的定义:连通无回路的无向图是一棵树. 有关树的问题: 1.最小生成树. 2.次小生成树. 3.有向图的最小树形图. 4.LCA(树上两点的最近公共祖先). 5.树的最小支配集.最小点覆盖.最大独立集 ...

  8. hdu2121 Ice_cream’s world II 最小树形图(难)

    这题比HDU4009要难一些.做了4009,大概知道了最小树形图的解法.拿到这题,最直接的想法是暴力.n个点试过去,每个都拿来做一次根.最后WA了,估计是超时了.(很多题都是TLE说成WA,用了G++ ...

  9. bzoj4349: 最小树形图

    最小树形图模板题…… 这种\(O(nm)\)的东西真的能考到么…… #include <bits/stdc++.h> #define N 60 #define INF 1000000000 ...

随机推荐

  1. HDU2425:Hiking Trip(简单bfs,优先队列实现)

    题目: 传送门 题意很简单就不解释了,水题一道. #include <iostream> #include <string.h> #include <stdio.h> ...

  2. std::decay

    参考资料 • cplusplus.com:http://www.cplusplus.com/reference/type_traits/decay/ • cppreference.com:http:/ ...

  3. MFC程序执行过程剖析

    一 MFC程序执行过程剖析 1)我们知道在WIN32API程序当中,程序的入口为WinMain函数,在这个函数当中我们完成注册窗口类,创建窗口,进入消息循环,最后由操作系统根据发送到程序窗口的消息调用 ...

  4. JQuery点击标题实现div的收缩

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  5. mysql update 多表 (复制)

    定我们有两张表,一张表为Product表存放产品信息,其中有产品价格列Price:另外一张表是ProductPrice表,我们要将ProductPrice表中的价格字段Price更新为Price表中价 ...

  6. ZJOI 2009 假期的宿舍 最大匹配

    主要是main()中的处理,接下来就是二分匹配的模板题了 #include<cstdio> #include<cstring> #define maxn 110 using n ...

  7. [HZNUOJ] 博

    Description 定义一个数字序列为“非下降序列”: 此处我们约定用$n\;表示数字序列的长度,下面定义在n \in [1, \infty]时有效$ $if \;\; n = 1:$ $\;\; ...

  8. ansible playbook基本操作

    一.ansible playbook简单使用 相当于是把模块写入到配置文件里面 vim /etc/ansible/test.yml //写入如下内容: --- - hosts: 127.0.0.1 r ...

  9. SparkStreaming程序设计

    一个简单的 Streamin wordCount object StreamingWordCount { def main(args: Array[String]): Unit = { val spa ...

  10. awk十三问-【AWK学习之旅】

    ---===AWK学习之旅===--- 十三个常用命令行处理   [root@monitor awkdir]# cat emp.txt Beth 4.00 0 Dan 3.75 0 Kathy 4.0 ...