zoukankan      html  css  js  c++  java
  • 最小生成树(kruskal算法)

    kruskal 算法是利用边来进行的,而prim算法是利用点来进行的;

    下面来介绍kruskal 算法:

    废话少说贴代码:

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    
    struct edge
    {
        int from;
        int to;
        int cost;
        bool operator < (edge a,edge b) //operator 重载操作符
        {                               //数据类型 operator (重载内容) (参数)
            return a.cost < b.cost;
        }
    }e[];
    
    
    //并查集内容:
    //f[] 表示父亲节点;
    void ufs_iint(int n)   //初始化集合;
    {
        for(int i = 0; i < n; i++)
            f[i] = i;
    }
    
    int Find(int x)           // 查找函数:
    {
        if(f[x] == x)
            return x;
        else return Find(f[x]);
    }
    
    void merger(int x,int y)
    {
        int fx,fy;
        fx = Find(x);
        fy = Find(y);
        if(fx != fy)
            f[fy] = fx;
    }
    //并查集结束;
    
    int kruskal(int n,int point) //n代表边数, point代表点数;
    {
        int sum = 0,cnt = 0;
        sort(e,e + n); //上面结构体中已经进行了重载;
        ufs_iint(n);
        for(int i = 0; i < n; i++)
        {
            if(Find(e[i].from) != Find(e[i].to))
                {
                    merger(e[i].from,e[i].to);
                    sum += e[i].cost;
                    if(++cnt == point - 1)
                        break;
                }
            return cnt == point - 1? sum : -1;//这里返回的是最小生成树的总边权;
        }
    }

    它更适合求稀疏图;而prim算法更适合求稠密图;

  • 相关阅读:
    Xshell连接阿里云Centos6.8
    vsftpd文件服务器安装与配置
    JDK安装(linux系统)
    网站架构
    linux软件源配置
    java 调用静态方法和构造函数和静态块执行的先后顺序
    Mybatis的WHERE和IF动态
    MAVEN项目(仓库中没有jar包)
    Shiro
    MVC系列学习(六)-Razor语法
  • 原文地址:https://www.cnblogs.com/zhaoningzyn/p/6581286.html
Copyright © 2011-2022 走看看