关闭

[置顶] 并查集解决最优灌溉问题(最小生成树问题)

标签: 数据结构最小生成树最优灌溉
120人阅读 评论(0) 收藏 举报
分类:

以下都是个人理解,解释别人写好的代码,随便写写
1.什么是并查集
是一种数据结构,其实也就是一种树结构
把i节点的父节点保存在array[i]数组里,根节点的父节点为自身。
对于这种数据结构可以实现的功能有两个
(1)查找一个节点的根节点,通过数组里保存的父节点一层一层向上查找,知道找到一个节点的父节点是自己,那这个节点就是根节点了。
(2)判断两个节点是否属于一个树,找到这两个节点的根节点进行比较,如果根节点相同,这两个节点就属于一个树,如果不相同,就不属于一个树。
(3)把两个树合并,在功能(2)中如果判断出两个节点不属于一个树,想要把这两个树合并,就把其中一个节点的根节点的父节点从自身变更为另一个节点的根节点,就可以实现两个树的合并,即并集。
2.最优灌溉问题
本质都一样,求最小生成树
3.代码实现

# include <iostream>
# include <algorithm>
using namespace std;
struct vex  //水渠结构体数组
{
    int i,j,a;
};
int node[100];   //并查集的节点数组,值代表当前节点的父节点
bool comp(vex a,vex b) //自定义比较函数
{
    return a.a<b.a;
}
int find( int a) //并查集的查询算法
{
    return node[a] == a ? a : find(node[a]);
}
int main()
{
    int m,n;//m代表麦田数量   n代表可建立的水渠数量
    scanf("%d %d",&m,&n);
    vex v[100];
    for(int i =0;i<n;i++)
    {
        scanf("%d %d %d",&v[i].i,&v[i].j,&v[i].a); //输入每一条可建造的水渠的数据
    }
    for(int i=0;i<m;i++)
    {
        node[i] = i;  //初始化每个麦田所在树结构的根节点为自身
    }
    sort(v,v+m,comp);//先根据每条水渠的花费对水渠结构体数组进行排序 从小到大
    int num = 0;//  记录最终花费
    int bian = 0; //记录当前建造的水渠数量
    for(int i = 0;bian < m-1;i++) 
    {
        if(find(v[i].i) != find(v[i].j)) //如果父节点不相同,说明该两个麦田不在一个树中,则把该两个节点合并到一个树中,即使父节点相同,
        {                                                                       //建造这两个麦田之间的水渠,因为已经过排序,所以是当前花费最少的一个水渠   
            num+=v[i].a; //增加花费                                    如果两个麦田的根节点相同,说明这两个麦田以通水田,不需要再建立,则跳过该条水渠的建立
            bian++; //增加水渠数量
            node[v[i].j] = find(v[i].i); //使v[j].j节点的根节点 = v[i].i节点的根节点
            printf("%d --- %d     %d\n",v[i].i,v[i].j,v[i].a);  //打印出当前建造的水渠的起始于结束节点与花费
        }
    }
    printf("最少花费:   %d",num);
    return 0;
}

这里面用到了sort函数,是algorithm库里自带的一个排序函数。

0
0
查看评论

ccf 最优灌溉(prime模板)

模板题#include using namespace std; #define INF 0x3f3f3f3f int lowcost[1010]; int e[1010][1010]; bool vis[1010]; int n,m,sum; void prime() { vis[1]=1;...
  • silence401
  • silence401
  • 2016-11-08 23:10
  • 771

CCF201412-4 最优灌溉(解法二)(100分)【废除!!!】

试题编号:201412-4试题名称:最优灌溉时间限制:1.0s内存限制:256.0MB问题描述:问题描述  雷雷承包了很多片麦田,为了灌溉这些麦田,雷雷在第一个麦田挖了一口很深的水井,所有的麦田都从这口井来引水灌溉。  为了灌溉,雷雷需要建立一些水渠,以连接水井和麦田,雷雷也可以利用部分麦田作为“中...
  • tigerisland45
  • tigerisland45
  • 2017-02-07 22:37
  • 1253

POJ 2728 最优比率生成树 01分数规划问题

网上有一些很数学的证明方法,表示看的挺晕,自己理解了一下后,发表下自己的看法,如果有错误,再进行修改 其实原题就是求 MIN( ∑CiXi / ∑DiXi ) Xi∈{0,1} ,对每个生成树,设其比率r=∑CiXi / ∑DiXi ,可得∑CiXi - ∑DiXi * r=0(条件1)...
  • sdj222555
  • sdj222555
  • 2012-04-23 18:58
  • 3575

各种奇怪的生成树问题

#各种奇怪的生成树问题 最近做了5道生成树问题,现在总结一下。 - 求最大边最小边差值最小的生成树 - 次小生成树 - 有向图生成树(最小树形图) - 最优比率生成树 - 顶点度数有限制的MST ##1.求最大边最小...
  • u012765765
  • u012765765
  • 2014-08-19 23:33
  • 555

CCF——最优灌溉(最小生成树)

#include #include #include using namespace std; typedef long long ll; #define MAX 1007 typedef struct{ int x,y,c; }NODE; NODE e[MAX*MAX]; int id[MAX]...
  • arz74
  • arz74
  • 2016-09-05 23:32
  • 370

并查集-201412-4 最优灌溉

试题编号: 201412-4 试题名称: 最优灌溉 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述   雷雷承包了很多片麦田,为了灌溉这些麦田,雷雷在第一个麦田挖了一口很深的水井,所有的麦田都从这口井来引水灌溉。   为了灌溉,雷雷需要建立一...
  • zhsy28
  • zhsy28
  • 2016-10-22 09:29
  • 636

CCF之最优灌溉(java)

试题编号: 201412-4 试题名称: 最优灌溉 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述   雷雷承包了很多片麦田,为了灌溉这些麦田,雷雷在第一个麦田挖了一口很深的水井,所有的麦田都从这口井来引水灌溉。   为了灌溉,雷雷需要建立一...
  • zjj582984208
  • zjj582984208
  • 2017-02-15 20:40
  • 184

复杂网络(2)--图论的基本理论-最小生成树问题

连通且不含圈的无向图称为树(tree)。树中度为1的节点称为树叶,度大于1的节点称为分支点。 若图G=(V,E)的生成子图是一棵树,则称该树为图G的生成树(spanning tree),也称支撑树,简称为图G的树。图G中属于生成树的边称为树枝(branch)。 连通图G=(V,E),每条边上有非...
  • jinxiaonian11
  • jinxiaonian11
  • 2016-12-18 22:13
  • 21376

第三次CCF计算机软件能力认证考试题解(Java)--201412--最优灌溉--100分通过

问题描述   雷雷承包了很多片麦田,为了灌溉这些麦田,雷雷在第一个麦田挖了一口很深的水井,所有的麦田都从这口井来引水灌溉。   为了灌溉,雷雷需要建立一些水渠,以连接水井和麦田,雷雷也可以利用部分麦田作为“中转站”,利用水渠连接不同的麦田,这样只要一片麦田能被灌溉,则与其连接的麦田也能被灌溉。 ...
  • u010266343
  • u010266343
  • 2016-03-22 23:12
  • 801

ccf 最优灌溉

问题描述   雷雷承包了很多片麦田,为了灌溉这些麦田,雷雷在第一个麦田挖了一口很深的水井,所有的麦田都从这口井来引水灌溉。   为了灌溉,雷雷需要建立一些水渠,以连接水井和麦田,雷雷也可以利用部分麦田作为“中转站”,利用水渠连接不同的麦田,这样只要一片麦田能被灌溉,则与其连接的麦田也能被灌溉。  ...
  • u014015305
  • u014015305
  • 2016-03-21 12:55
  • 654
    个人资料
    • 访问:6328次
    • 积分:400
    • 等级:
    • 排名:千里之外
    • 原创:34篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1条
    最新评论