连通图
在图中,任意俩个节点都有一条路径,我们把这种图称为连通图。
生成树
连通图可能有多个边其中可能有环,但是生成树是由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&