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个点的直接父亲编号最小 [题解] ...
随机推荐
- bashrc的加载
无意中将home下的所有文件都删除了,一些配置文件都丢了. 重新登陆后,发现无法加载bashrc. 查找后,发现问题不在于bashrc,而在与.bash_profile丢失 login shell m ...
- nyoj 118 修路方案(最小生成树删边求多个最小生成树)
修路方案 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述 南将军率领着许多部队,它们分别驻扎在N个不同的城市里,这些城市分别编号1~N,由于交通不太便利,南将军准备修 ...
- MFC编辑框换行实现
MFC中换行实现 在mfc中编辑框允许输入多行时,换行符被表示为<归位><换行>即“\r\n”,用ascii码表示为13 10 如果为编辑框中想要输入换行,就请将编辑框的属性: ...
- ssl配置
Apache SSL配置 作者: JeremyWei | 可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址: http://weizhifeng.net/apache-ssl.h ...
- Flex友好提示、警告
Flex 自带的Alert带给用户的体验并不好,对于一些简单的提示来说,这个小题大作了. <?xml version="1.0" encoding="utf-8&q ...
- 更新插件时提示“正在更新缓存”“正在等待jockey-backend退出”
Ubuntu 11 更新语言插件, 更新时 提示正在更新缓存”“正在等待jockey-backend退出”,然后就不动了. 解决方案: 在终端中键入ps -e | grep jockey 系统会显示一 ...
- PostgreSQL中,database,schema,table之间关系
从逻辑上看,schema,table,都是位于database之下. 首先,在postgres数据库下建立表(相当于建立在public schema下): [pgsql@localhost bin]$ ...
- Educational Codeforces Round 1 B. Queries on a String 暴力
B. Queries on a String Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/59 ...
- Python标准库:迭代器Itertools
Infinite Iterators: Iterator Arguments Results Example count() start, [step] start, start+step, star ...
- jsonp跨域原理解析
前言: 跨域请求是前台开发中经常遇到的场景,但是由于浏览器同源策略,导致A域下普通的http请求没法加载B域下的数据,跨域问题由此产生.但是通过script标签的方式却可以加载非同域下的js,因此可以 ...