hdu4009最小树形图
多建一个根,连到每一个点,然后花费是建水井的钱
然后跑一边最小树形图即可,这题必定有解,因为可以从根开始到每一点,可以不用判无解的情况
#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最小树形图的更多相关文章
- hdu4009最小树形图板子题
/*调了一下午的最小树形图,昨天刚刚看懂模板..最小树形图,就是有向图的最小生成树,很神奇==*/ #include<iostream> #include<cstring> # ...
- HDU4009 Transfer water —— 最小树形图 + 不定根 + 超级点
题目链接:https://vjudge.net/problem/HDU-4009 Transfer water Time Limit: 5000/3000 MS (Java/Others) Me ...
- 最小树形图(hdu4009)
Transfer water Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others) T ...
- hdu4009 Transfer water 最小树形图
每一户人家水的来源有两种打井和从别家接水,每户人家都可能向外输送水. 打井和接水两种的付出代价都接边.设一个超级源点,每家每户打井的代价就是从该点(0)到该户人家(1~n)的边的权值.接水有两种可能, ...
- HDU4009 Transfer water 【最小树形图】
Transfer water Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others) T ...
- POJ 3164 Command Network 最小树形图模板
最小树形图求的是有向图的最小生成树,跟无向图求最小生成树有很大的区别. 步骤大致如下: 1.求除了根节点以外每个节点的最小入边,记录前驱 2.判断除了根节点,是否每个节点都有入边,如果存在没有入边的点 ...
- 树的问题小结(最小生成树、次小生成树、最小树形图、LCA、最小支配集、最小点覆盖、最大独立集)
树的定义:连通无回路的无向图是一棵树. 有关树的问题: 1.最小生成树. 2.次小生成树. 3.有向图的最小树形图. 4.LCA(树上两点的最近公共祖先). 5.树的最小支配集.最小点覆盖.最大独立集 ...
- hdu2121 Ice_cream’s world II 最小树形图(难)
这题比HDU4009要难一些.做了4009,大概知道了最小树形图的解法.拿到这题,最直接的想法是暴力.n个点试过去,每个都拿来做一次根.最后WA了,估计是超时了.(很多题都是TLE说成WA,用了G++ ...
- bzoj4349: 最小树形图
最小树形图模板题…… 这种\(O(nm)\)的东西真的能考到么…… #include <bits/stdc++.h> #define N 60 #define INF 1000000000 ...
随机推荐
- rf调参小结
转自http://www.cnblogs.com/pinard/p/6160412.html 1. scikit-learn随机森林类库概述 在scikit-learn中,RF的分类类是RandomF ...
- EventFiringWebDriver网页事件监听(一)
Selenium提供了很多的event listening functions来跟踪脚本执行过程中的events. How it works? 在注册了listener的webDriver里面,这些l ...
- HTML5游戏开发系列教程7(译)
原文地址:http://www.script-tutorials.com/html5-game-development-lesson-7/ 今天我们将完成我们第一个完整的游戏--打砖块.这次教程中,将 ...
- TabLayout与ViewPager同步后Tab的标题不显示
一.概述 1.1 问题描述 TabLayout+ViewPager后,TabLayout的TabItem不显示的问题: 1.2 截图 二.结论 mTabs.setupWithViewPager(mVi ...
- Kattis - bank 【简单DP】
Kattis - bank [简单DP] Description Oliver is a manager of a bank near KTH and wants to close soon. The ...
- 字符编码的发展(ASCII、Unicode、utf-8)
最近一直在看廖雪峰老师的python网上教程,python内容简单易理解,就没整理,但是字符串编码作为一直困扰自己的问题,看了几遍文章,最终还是将其整理如下,本篇博客总结自廖雪峰老师的网上教程:htt ...
- windows7上安装php7和apche2.4
windows7在配置php7+apache2.4 1.下载并安装vc14http://www.microsoft.com/zh-cn/download/details.aspx?id=48145下载 ...
- 在vi中打开多个文件,复制一个文件中多行到另一个文件中
:set number 查看行号1.vi a.txt b.txt或者vi *.txt 2.文件间切换 :n切换到下一个文件,:wn保存再切换 :N到上一个文件,:wN保存再切换 :.=看当前行 3.比 ...
- kafka监控搭建
1. 下载 wget https://github.com/quantifind/KafkaOffsetMonitor/releases/download/v0.2.1/KafkaOffsetMoni ...
- 20145302张薇《Java程序设计》实验二报告
20145302张薇<Java程序设计>实验二:Java面向对象程序设计 使用TDD的方式设计实现复数类:Complex 测试代码 import org.junit.Test; publi ...