最小生成树经典算法(C++版)

本文介绍了使用C++实现最小生成树的两种经典算法:Prim算法和Kruskal算法。Prim算法利用优先队列数据结构,分为延时实现和实时实现两种方式;Kruskal算法则结合了加权路径压缩的union-find算法。通过main.cpp测试文件运行,验证了这两种算法都能正确求解同一图的最小生成树权值和。
摘要由CSDN通过智能技术生成

EdgeWeightedGraph.h

#pragma once
#include <memory>
#include <stdexcept>
#include <fstream>
#include <iterator>
#include <sstream>
#include "priority_queue.h"
template <typename T>
class LazyPrimMST;
template <typename T>
class PrimMST;
template<typename T>
class Kruskal;
template<typename T>
class EdgeWeightedGraph
{
public:
    class AdjacentcyList
    {
    public:
        class Edge
        {
        public:
            std::shared_ptr<Edge> next;
            int v1;
            int v2;
            T weight;
            Edge(const int& v1,const int& v2,const T& w):v1(v1),v2(v2),weight(w),next(nullptr)
            {
            }
            Edge(const Edge& e) :v1(e.v1), v2(e.v2), weight(e.weight), next(nullptr)
            {

            }
            Edge() = default;
            friend std::ostream& operator << (std::ostream& os, const Edge& e);
            friend bool operator < (const Edge& lhs,const Edge& rhs)
            {
                return lhs.weight < rhs.weight;
            }
            friend bool operator == (const Edge& lhs,const Edge& rhs)
            {
                return lhs.weight == rhs.weight;
            }
/******************************************
函数名称:   Weight
函数说明:   返回相应边的权重
返回值:        T
*******************************************/
            T Weight()const
            {
                return weight;
            }
/******************************************
函数名称:   either
函数说明:   返回边顶点之一
返回值      int
*******************************************/
            int either()const
            {
                return v1;
            }
/******************************************
函数名称:   other
函数说明:   返回边的另一顶点
返回值:        int
*******************************************/
            int other(const int& v)
            {
                if (v == v1)
                    return v2;
                else if (v == v2)
                    return v1;
                else
                    throw std::out_of_range("other's arguement out_of_range");
            }
        };
        std::shared_ptr<Edge> head;
        class Iterator
        {
        private:
            std::shared_ptr<Edge> it;
        public:
            Iterator(std::shared_ptr<Edge> i):it(i)
            {

            }
            bool operator ==(const Iterator& rhs)const
            {
                return it == rhs.it;
            }
            bool operator !=(const Iterator& rhs)const
            {
                return it != rhs.it;
            }
            Iterator operator ++()
            {
                it = it->next;
                return *this;
            }
            Edge operator *()
            {
                if (it == nullptr)
                    throw std::logic_error("can't * nullpoint");
                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值