hdu 4009 最小树形图
思路:唯一一个值得一提的就是建一个0号根节点,往每个房子建一条边,权值为房子的高度乘以X。
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #include<cmath>
- #define Maxn 1010
- #define Maxm Maxn*Maxn
- #define inf 100000000
- using namespace std;
- int head[Maxn],vi[Maxn],id[Maxn],in[Maxn],pre[Maxn],cnt,X,Y,Z,n,e;
- struct Edge{
- int u,v,next,val;
- }edge[Maxm];
- struct Point{
- int x,y,z;
- }p[Maxn];
- void init()
- {
- memset(head,-,sizeof(head));
- e=;
- }
- void add(int u,int v,int val)
- {
- edge[e].u=u,edge[e].v=v,edge[e].val=val,edge[e].next=head[u],head[u]=e++;
- }
- int Dis(Point a,Point b)
- {
- return abs(a.x-b.x)+abs(a.y-b.y)+abs(a.z-b.z);
- }
- int directed_MST(int root,int N,int E)
- {
- int ans=,i,j,u,v;
- while()
- {
- for(i=;i<N;i++)
- in[i]=inf;
- for(i=;i<E;i++)
- {
- u=edge[i].u,v=edge[i].v;
- if(in[v]>edge[i].val&&u!=v)
- {
- pre[v]=u;
- in[v]=edge[i].val;
- }
- }
- for(i=;i<N;i++)
- {
- if(i==root) continue;
- if(in[i]==inf) return -;
- }
- memset(vi,-,sizeof(vi));
- memset(id,-,sizeof(id));
- cnt=;
- in[root]=;
- for(i=;i<N;i++)//枚举每个可能是环上的点
- {
- ans+=in[i];
- v=i;
- while(vi[v]!=i&&id[v]==-&&v!=root)
- {
- vi[v]=i;v=pre[v];
- }
- if(v!=root&&id[v]==-)//如果退出上个循环的条件不是v==root,就是vi[i]==i,即找到了环
- {
- for(u=pre[v];u!=v;u=pre[u])//对环进行统一标号
- id[u]=cnt;
- id[v]=cnt++;
- }
- }
- if(cnt==) break;//无环 ,退出
- for(i=;i<N;i++) if(id[i]==-) id[i]=cnt++;
- for(i=;i<E;i++)//进行缩点,并修改每条边的权值。
- {
- v=edge[i].v;
- edge[i].u=id[edge[i].u];
- edge[i].v=id[edge[i].v];
- if(edge[i].u!=edge[i].v)
- edge[i].val-=in[v];
- }
- N=cnt;
- root=id[root];
- }
- return ans;
- }
- int main()
- {
- int i,j,a,b,c,k;
- while(scanf("%d%d%d%d",&n,&X,&Y,&Z),n|X|Y|Z)
- {
- init();
- for(i=;i<=n;i++)
- scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].z);
- for(i=;i<=n;i++)
- {
- scanf("%d",&k);
- for(j=;j<=k;j++)
- {
- scanf("%d",&a);
- if(a==i) continue;
- if(p[a].z>p[i].z)
- add(i,a,Dis(p[a],p[i])*Y+Z);
- else
- add(i,a,Dis(p[a],p[i])*Y);
- }
- }
- for(i=;i<=n;i++)
- add(,i,X*p[i].z);
- printf("%d\n",directed_MST(,n+,e));
- }
- return ;
- }
hdu 4009 最小树形图的更多相关文章
- hdu 4009 最小树形图模板题朱刘算法
#include<stdio.h> /*思路:显然对于每个地方, 只有一种供水方式就足够了,这样也能保证花费最小, 而每个地方都可以自己挖井,所以是不可能出现无解的情况的, 为了方便思考, ...
- hdu 4966 最小树形图
将每门课等级拆成0,1,2,3...a[i]个点,对每一个等级大于0的点向它低一级连边,权值为0[意思是,若修了level k.则level(0~k)都当做修了] 将输入的边建边,权值为money[i ...
- HDU 4009 Transfer water(最小树形图)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4009 题意:给出一个村庄(x,y,z).每个村庄可以挖井或者修建水渠从其他村庄得到水.挖井有一个代价, ...
- hdu 2121 , hdu 4009 无定根最小树形图
hdu 2121 题目:给出m条有向路,根不确定,求一棵最小的有向生成树. 分析:增加一个虚拟节点,连向n个节点,费用为inf(至少比sigma(cost_edge)大).以该虚拟节点为根求一遍最小树 ...
- HDU 4009——Transfer water——————【最小树形图、不定根】
Transfer water Time Limit:3000MS Memory Limit:65768KB 64bit IO Format:%I64d & %I64u Subm ...
- HDU 4009 Transfer water 最小树形图
分析:建一个远点,往每个点连建井的价值(单向边),其它输水线按照题意建单向边 然后以源点为根的权值最小的有向树就是答案,套最小树形图模板 #include <iostream> #incl ...
- HDU 2121 Ice_cream’s world II 最小树形图 模板
开始学习最小树形图,模板题. Ice_cream’s world II Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32 ...
- HDU 6141 I am your Father!(最小树形图+权值编码)
http://acm.hdu.edu.cn/showproblem.php?pid=6141 题意: 求最大树形图. 思路: 把边的权值变为负值,那么这就是个最小树形图了,直接套模板就可以解决. 有个 ...
- HDU 6141 I am your Father!(最小树形图)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6141 [题目大意] 给出一个有向图,求1点为根的最小树形图使得第n个点的直接父亲编号最小 [题解] ...
随机推荐
- HDU 5833 Zhu and 772002 (高斯消元)
Zhu and 772002 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5833 Description Zhu and 772002 are b ...
- MongoDB Windows 下安装部署
下面主要是我在Windows上(Win7)安装.运行.安装Windows服务的笔记,以作备忘. 1.下载 下载地址:http://www.mongodb.org/downloads 从其下载页面就可以 ...
- 【Java】C/C++与Java的简单比较
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5827273.html C/C++: 编译(不同的系统编译出不同的机器码,所以同一 ...
- update多表更新的2种方式
update t1 set TermBeginQty =isnull((select top 1 JiaoPlusQty from WMS_RptMaterialPutDaily r where t1 ...
- linux常用命令-搜索
1.find $ find . -name nginx* $ find . -name nginx* -ls $ find . -type f -mmin -10 搜索当前目录中,所有过去10分钟中更 ...
- windows command ftp 中文文件名乱码解决方法
有时,使用临时的windows机子,要进行ftp简单操作,但又不想装其它的ftp-client,可以直接使用windows command中的命令ftp来操作. 通常,ftp服务器按标准,使用utf8 ...
- C++ Caption
主题 1. 设置控件的标题文本 2. 获取控件的标题文本 Caption属性 取得一个窗体的标题(caption)文字,或者一个控件的内容 红色的部分就是 Caption 标题 Set ...
- [Codeforces] 347B - Fixed Points
题意:给定一个序列,现有一种操作:两个数的位置互换.问最多操作一次.序列 [元素位置i] 与 [元素Ai] 相等的最多个数? 依据题意,最多个数为 : [操作之前[元素位置i] 与 [元素Ai] ...
- zencart技术联盟交流群
增加500人的免费互助"zencart技术联盟交流群"!名额不多,先到先得! zencart技术联盟俱乐部(1群) ( 已满) zencart技术联盟俱乐部(2群) 群号:1990 ...
- PhoneGap开发手机程序入门教程
用PhoneGap开发手机移动程序 1. 什么是PhoneGap PhoneGap是一个自由开放源码的开发工具和框架,允许利用HTML + JavaScript + CSS的强大功能在多个手机 ...