#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 最小树形图模板题朱刘算法
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
最小树形图(朱刘算法)
最小树形图 定义:一个
数据结构 POJ-3164 最小树形图 权值 i++ -
HDU 4966 GGS-DDU (最小树形图-朱刘算法)
题目地址:HDU 4966 刚开始没看清总级别只有500这一条件,看成了每一个都是5低
ACM 算法 编程 最小树形图 #include -
HDU 4009 Transfer water 最小树形图
题目:http://acm.hdu.edu.cn/showproblem.
HDU i++ #include 最小树形图 -
POJ 3164 Command Network (最小树形图-朱刘算法)
题目地址:POJ 3164 最小树形图第一发。
ACM 算法 编程 最小树形图 #include -
poj 3164 <朱刘算法《模板》求最小树形图>
题目链接: poj 3164有向图的最小树形图:此算法由朱永津和刘
i++ #include 最小树形图 -
最小树形图——朱刘算法
树形图是针对有向图的一个概念,可以类比自无向图的生成树。一张$n$个点的以$rt$为根的树形图,就是要保留图中的$n-1$条边,形成一棵以$rt$为根的外向树,使得从根节点能到达所有点。
朱刘算法 #define 最小树形图 最小生成树 有向图