hdu 4009 最小树形图模板题朱刘算法
#include<stdio.h>
/*思路:显然对于每个地方,
只有一种供水方式就足够了,这样也能保证花费最小,
而每个地方都可以自己挖井,所以是不可能出现无解的情况的,
为了方便思考,我们引入一个虚拟点,把所有自己挖井的都连到这个点,
边权为挖井的花费,而如果i能从j处引水,则从j向i连边,边权为引水的花费,
然后对这个有向图,以虚拟点为根,求最小树形图即可(最小树形图即为有向图的最小生成树)。*/
#include<string.h>
#include<math.h>
#include<stdlib.h>
#define N 1100
#define inf 999999999
struct node {
int x,y,z;
}f[N];
int n;
struct nodee{
int u,v,w;
}edge[N*N];
int manhadun(int x,int y) {
return abs(f[x].x-f[y].x)+abs(f[x].y-f[y].y)+abs(f[x].z-f[y].z);
}
int yong,visit[N],pre[N],fffma[N],id[N];
void addedge(int u,int v,int w) {
edge[yong].u=u;
edge[yong].v=v;
edge[yong++].w=w;
}
int zhuliu(int root) {
int sum=0,i;
while(1) {
for(i=0;i<=n;i++)
fffma[i]=inf;
memset(visit,-1,sizeof(visit));
memset(id,-1,sizeof(id));
for(i=0;i<yong;i++){
int u=edge[i].u,v=edge[i].v;
if(edge[i].w<fffma[v]&&u!=v) {//求所有除根节点外的点,选择一天最小权值的边
pre[v]=u;//记录前驱
fffma[v]=edge[i].w;
}
}
fffma[root]=0;
pre[root]=root;
for(i=0;i<=n;i++){//若有孤立点则无解
if(fffma[i]==inf)return -1;
sum+=fffma[i];
}
int res=0;
for(i=0;i<=n;i++)//所选择的边有没有环和环的个数
if(visit[i]==-1) {
int v=i;
while(visit[v]!=i&&id[v]==-1) {//这个地方需要注意
visit[v]=i;
v=pre[v];
}
if(visit[v]!=i||v==root)continue;
int u;
for(u=pre[v];u!=v;u=pre[u])
id[u]=res;
id[v]=res++;
}
if(res==0) return sum;//如果无环,则直接返回解
for(i=0;i<=n;i++)//将环外的点都加入
if(id[i]==-1)
id[i]=res++;
for(i=0;i<yong;i++) {//缩点出边不变,入边变
edge[i].w-=fffma[edge[i].v];
edge[i].u=id[edge[i].u];
edge[i].v=id[edge[i].v];
}
n=res-1;root=id[root];//相当于建立了一个新图,root也会改变
}
return sum;
}
int main() {
int i,j,k,x,y,z;
while(scanf("%d%d%d%d",&n,&x,&y,&z),n||x||y||z) {
yong=0;
for(i=1;i<=n;i++) {
scanf("%d%d%d",&f[i].x,&f[i].y,&f[i].z);
addedge(0,i,f[i].z*x);//构造的虚拟点0为根节点,权值为每家建井的费用
}
for(i=1;i<=n;i++) {
scanf("%d",&k);
while(k--) {
scanf("%d",&j);
if(j==i)continue;
if(f[j].z>f[i].z)
addedge(i,j,manhadun(i,j)*y+z);
else
addedge(i,j,manhadun(i,j)*y);
}
}
printf("%d\n",zhuliu(0));
}
return 0;
}
hdu 4009 最小树形图模板题朱刘算法的更多相关文章
- poj3164最小树形图模板题
题目大意:给定一个有向图,根节点已知,求该有向图的最小树形图.最小树形图即有向图的最小生成树,定义为:选择一些边,使得根节点能够到达图中所有的节点,并使得选出的边的边权和最小. 题目算法:朱-刘算法( ...
- POJ 3164 Command Network(最小树形图模板题+详解)
http://poj.org/problem?id=3164 题意: 求最小树形图. 思路: 套模板. 引用一下来自大神博客的讲解:http://www.cnblogs.com/acjiumeng/p ...
- uva11183 最小树形图模板题
很简单的模板题,不多说了 #include<iostream> #include<cstring> #include<cstdio> #define INF 0x3 ...
- hdu 4009 最小树形图
思路:唯一一个值得一提的就是建一个0号根节点,往每个房子建一条边,权值为房子的高度乘以X. #include<iostream> #include<cstdio> #inclu ...
- POJ--3164--Command Network【朱刘算法】最小树形图
链接:http://poj.org/problem?id=3164 题意:告诉n个点坐标,m条边表示两个点之间有路.从1点開始建立一个有向图最小生成树. 朱刘算法模板题 =============== ...
- HDUOJ--2121--Ice_cream’s world II【朱刘算法】不定根最小树形图
链接:http://acm.hdu.edu.cn/showproblem.php? pid=2121 题意:n个顶点,m条边,求从某一点起建立有向图最小生成树而且花费最小.输出最小花费和根节点下标. ...
- uva11865 朱刘算法+二分
这题说的需要最多花费cost元来搭建一个比赛网络,网络中有n台机器,编号为0 - n-1其中机器0 为服务器,给了n条线有向的和他们的花费以及带宽 计算,使得n台连接在一起,最大化网络中的最小带宽, ...
- poj3164(最小树形图&朱刘算法模板)
题目链接:http://poj.org/problem?id=3164 题意:第一行为n, m,接下来n行为n个点的二维坐标, 再接下来m行每行输入两个数u, v,表点u到点v是单向可达的,求这个有向 ...
- HDU 2121 Ice_cream’s world II 最小树形图 模板
开始学习最小树形图,模板题. Ice_cream’s world II Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32 ...
随机推荐
- 阻塞、非阻塞、同步、异步IO
阻塞.非阻塞.同步.异步IO http://www.cnblogs.com/yunxitalk/p/9031306.html 介绍 在谈及网络IO的时候总避不开阻塞.非阻塞.同步.异步.IO多路复用. ...
- 利用递归分割(Split)字符串
利用递归分割(Split)字符串 SqlServer 递归 工作需要将表里的某个字段分割之后再插入到另一个表中,其实数据量不大,直接用游标一行一行的取,再利用循环来分割之后再实现数据的插入应该可以直接 ...
- 自顶向下(递归)的归并排序和自底向上(循环)的归并排序——java实现
归并排序有两种实现方式,自顶向下和自底向上.前者的思想是分治法,现将数组逐级二分再二分,分到最小的两个元素后,逐级往上归并,故其核心在于归并.后者的思想相反,采用循环的方式将小问题不断的壮大,最后变成 ...
- selenium3 + python - alert_is_present定位
from selenium import webdriverfrom selenium.webdriver.support.wait import WebDriverWaitfrom selenium ...
- Web框架系列之Tornado
前言 Tornado是使用Python编写的一个强大的.可扩展的Web服务器.它在处理严峻的网络流量时表现得足够强健,但却在创建和编写时有着足够的轻量级,并能够被用在大量的应用和工具中. Tornad ...
- BZOJ 1583
思路: 维护两个指针pointer_1和pointer_2 代表用算法一走到的位置 和算法2走到的位置 若 算法一<算法2 数组后面就插入算法一的解 pointer_1++ (记得判重) (这 ...
- spring定时任务Cron时间设定
直接举例: 0 10 0 * *?分别对应的是 秒 分 时 日 月 周 年 秒(0–59)分钟(0–59)小时(0–23)日(1–31)月(1–12或JAN–DEC)周(1–7或SUN–SAT)年(1 ...
- [转]Java web 开发 获取用户ip
如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP值,那么真正的用户端的真实IP则是取X-Forwarded-For中第一个非unknown的有效IP字符串. pu ...
- SQLServer2008 关于数值字段列的累计
create table #temp20110610( id int identity(1,1), date varchar(8), qty float) insert int ...
- PHP开发笔记(三)关于PHP伪静态的问题总结
Apache 第一个问题就是关于PHPStudy集成Apache环境下5.5版本以上”No input file specified“问题. 针对TP5框架,以下是.htaccess文件的配置,PHP ...