template
//模板参数依次为:顶点、权重、是否有向
struct Graph_matrix{
public:Graph_matrix() = default;
private:vector _vertex;unordered_map _indexMap; //顶点与下标的映射关系vector> _matrix; //用顶点下标表示边的关系
};
Graph_matrix(const V* _array, size_t n){//初始化_vertex,记录各顶点与下标的映射关系_vertex.reserve(n);for (size_t i = 0; i < n; i++){_vertex.push_back(_array[i]);_indexMap[_array[i]] = i;}//初始化邻接矩阵_matrix.resize(n);for (size_t i = 0; i < n; i++){_matrix[i].resize(n);for (size_t j = 0; j < n; j++){_matrix[i][j] = MAX_W;}}}
size_t getVertexIndex(const V& v){auto ret = _indexMap.find(v);if (ret != _indexMap.end()){return ret->second;}else{return -1;}}
void addEdge(const V& src, const V& dst, const W& w){int srcindex = getVertexIndex(src);int dstindex = getVertexIndex(dst);_matrix[srci][dsti] = w;//无向图要处理对称的地方if (Direction == false){_matrix[dsti][srci] = w;}}
void print(){for (auto e : _indexMap){cout << e.first << "->" << e.second << endl;}cout << " ";for (size_t i = 0; i < _vertex.size(); i++){cout << i << " ";}cout << endl;for (size_t i = 0; i < _matrix.size(); i++){cout << i << " ";for (size_t j = 0; j < _matrix[0].size(); j++){if (_matrix[i][j] == MAX_W){cout << "* ";}else{cout << _matrix[i][j] << " ";}}cout << endl;}}
//从某一顶点开始广度优先搜索void BFS(const V& src){size_t n = _vertex.size();vector visited(n, false); //标记访问过的顶点queue qu;int srci = getVertexIndex(src);qu.push(srci);visited[srci] = true;while (!qu.empty()){int cur = qu.front();qu.pop();cout << cur << "-> ";for (size_t i = 0; i < n; i++){ //让src的邻接顶点依次入队if (_matrix[cur][i] != MAX_W && visited[i] == false){qu.push(i);visited[i] = true;}}}}
//从某一顶点开始深度优先搜索void _DFS(int srci, vector& visited){size_t n = _vertex.size();cout << srci << "-> ";visited[srci] = true;//找与src相邻且没有被访问过的顶点,递归for (size_t i = 0; i < n; i++){if (_matrix[srci][i] != MAX_W && visited[i] == false){_DFS(i, visited);}}}void DFS(const V& src){int srci = getVertexIndex(src);vector visited(_vertex.size(), false);_DFS(srci, visited);}
查看克鲁斯卡尔算法的代码实现
查看普里姆算法的代码实现
查看迪杰斯特拉算法的代码实现
查看贝尔曼福特算法的代码实现
查看弗洛伊德算法的代码实现