图的实现(带有深度/广度优先遍历/最小生成树算法)

连通图

  在图中,任意俩个节点都有一条路径,我们把这种图称为连通图。

生成树

  连通图可能有多个边其中可能有环,但是生成树是由N个节点,N-1条边构成的连通图。它是一个特殊的连通图,其中没有环路。

最小生成树

  因为N个节点,N-1条边构成生成树。那么就存在多个生成树,那么这么生成树中权值最小的生成树叫做最小生成树。
  kruskal是构成最小生成树的一种算法,这个算法就是在图中不断地选出权值最小的边,一直选出N-1条即可。如果选的过程中遇见有构成环路的边,就选下一条权值次小的边即可。

广度优先/深度优先

  这是俩种不同遍历图的方式,深度优先强调一直遍历,直到遍历到无法遍历的位置,再回退到上一节点,遍历与上一节点相邻的另一个节点。一般用递归实现。
  广度优先,强调先把当前节点相邻的节点都访问了,然后在遍历相邻节点的相邻节点,一般用队列实现。因为队列是头删尾进,先进先出的原则,所以更好符合条件。

代码实现
#pragma once
#include<string>
#include<iostream>
#include<vector>
#include<unordered_map>
#include<queue>
#include"Union.h"
using namespace std;
struct Edge
{
    Edge( size_t src, size_t dst,int weight)
    :_weight(weight), _src(src), _dst(dst)
    {}
    int _weight;
    size_t _src;
    size_t _dst;
    Edge * next;
};
template<class V, bool digraph>
class graph
{
public:
    graph()
    {}
    graph(vector<V>&vertrix)
    {
        _vertrix.reserve(vertrix.size());
        int index = 0;
        for (auto&i : vertrix)
        {
            _vertrix.push_back(i);
            _hash[i] = index++;
        }
        linktable.resize(_vertrix.size());
    }
    graph(const graph<V, digraph>&object)
        :_vertrix(object._vertrix), linktable(object.linktable), _hash(object._hash)
    {}
    graph<V, digraph>&operator=(const graph<V, digraph>object)
    {
        _vertrix.swap(object._vertrix);
        _hash.swap(object._hash);
        // this->linktable.swap(object.linktable);
    }
    void Addedge(const V&
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值