【数据结构与算法】带权有向图
来源:互联网 发布:淘宝生意参谋标准版 编辑:程序博客网 时间:2024/04/23 22:55
MyGraph.h
#pragma once#include <iostream>#include <stack>#include <queue>using namespace std;// 邻接矩阵// 带权有向图const int MAXSIZE = 20;const int INFINITE = 100;template <class T>class CMyGraph{public: CMyGraph(); ~CMyGraph();private: T vertexArray[MAXSIZE] = {0}; // 顶点集合 int edge[MAXSIZE][MAXSIZE]; // 边集合 int numVertex = 0; // 顶点的数量 int numEdge = 0; // 边的数量private: bool isGraphEmpty(void) const; // 图是否为空 bool isGraphFull(void) const; // 图是否满了 int getVertexPos(const T& vertex); // 得到顶点的位置,若不存在则返回-1 void errorMessage(int i); // 错误信息public: int GetNumOfVertices(void) const; // 获得顶点的数量 int GetNumOfEdge(void) const; // 边的数量 int GetWeight(const T& vertex1, const T& vertex2); //得到边的权重 void InsertVertex(const T& vertex); // 插入顶点 void InsertEdge(const T& vertex1, const T& vertex2, const int weight); // 插入边 void DeleteVertex(const T& vertex); // 删除顶点 void DeleteEdge(const T& vertex1, const T& vertex2); // 删除边 void Display(void); // 显示图 T* DepthFirstSearch(const T& beginVertex); //深度优先搜索 T* BreathFirestSearch(const T& beginVertex);//广度优先搜索 bool PathConnect(const T& vertex1, const T& vertex2); //两顶点之间是否联通};
MyGraph.cpp
#include "MyGraph.h"template<class T>CMyGraph<T>::CMyGraph(){ for (int i = 0; i < MAXSIZE; i++) { for (int j = 0; j < MAXSIZE; j++) { if (i == j) { edge[i][j] = 0; } else { edge[i][j] = INFINITE; } } }}template<class T>CMyGraph<T>::~CMyGraph(){}template<class T>bool CMyGraph<T>::isGraphEmpty(void) const{ if (0 == numVertex) { return true; } return false;}template<class T>bool CMyGraph<T>::isGraphFull(void) const{ if (MAXSIZE == numVertex) { return true; } return false;}template<class T>int CMyGraph<T>::getVertexPos(const T & vertex){ for (int i = 0; i < numVertex; i++) { if (vertex == vertexArray[i]) { return i; } } return -1;}template<class T>void CMyGraph<T>::errorMessage(int i){ switch (i) { case 1: cout << "图已满" << endl; break; case 2: cout << "图为空" << endl; break; case 3: cout << "顶点已存在" << endl; break; case 4: cout << "顶点不存在" << endl; break; case 5: cout << "权值超最大值" << endl; break; case 6: cout << "不允许两个顶点相同" << endl; break; default: break; }}template<class T>int CMyGraph<T>::GetNumOfVertices(void) const{ return numVertex;}template<class T>int CMyGraph<T>::GetNumOfEdge(void) const{ return numEdge;}template<class T>int CMyGraph<T>::GetWeight(const T & vertex1, const T & vertex2){ if (vertex1 == vertex2) { errorMessage(6); return 0; } int pos1 = getVertexPos(vertex1); int pos2 = getVertexPos(vertex2); if (-1 == pos1 || -1 == pos2) { errorMessage(4); return INFINITE; } return edge[pos1][pos2];}template<class T>void CMyGraph<T>::InsertVertex(const T & vertex){ if (isGraphFull()) { errorMessage(1); return; } if (-1 != getVertexPos(vertex)) { errorMessage(3); return; } vertexArray[numVertex] = vertex; numVertex++;}template<class T>void CMyGraph<T>::InsertEdge(const T & vertex1, const T & vertex2, const int weight){ if (vertex1 == vertex2) { errorMessage(6); return; } int pos1 = getVertexPos(vertex1); int pos2 = getVertexPos(vertex2); if (-1 == pos1 || -1 == pos2) { errorMessage(4); return; } if (weight >= INFINITE) { errorMessage(5); return; } edge[pos1][pos2] = weight; numEdge++;}template<class T>void CMyGraph<T>::DeleteVertex(const T & vertex){ if (isGraphEmpty()) { errorMessage(2); return; } int pos = getVertexPos(vertex); if (-1 == pos) { errorMessage(4); return; } if (pos == MAXSIZE - 1) { for (int i = 0; i < MAXSIZE - 1; i++) { edge[i][pos] = INFINITE; edge[pos][i] = INFINITE; } } else { for (int i = pos; i < MAXSIZE - 1; i++) { vertexArray[i] = vertexArray[i + 1]; } for (int i = 0; i < MAXSIZE - 1; i++) { edge[i][pos] = edge[i][pos + 1]; edge[pos][i] = edge[pos + 1][i]; } } numVertex--;}template<class T>void CMyGraph<T>::DeleteEdge(const T & vertex1, const T & vertex2){ if (vertex1 == vertex2) { errorMessage(6); return; } int pos1 = getVertexPos(vertex1); int pos2 = getVertexPos(vertex2); if (-1 == pos1 || -1 == pos2) { errorMessage(4); return; } edge[pos1][pos2] = INFINITE; numEdge--;}template<class T>void CMyGraph<T>::Display(void){ cout << "顶点集合:" << endl;; for (int i = 0; i < numVertex; i++) { cout << vertexArray[i] << " "; } cout << endl << "--------" << endl; cout << "边集合:" << endl;; for (int i = 0; i < numVertex; i++) { for (int j = 0; j < numVertex; j++) { cout << edge[i][j] << " "; } cout << endl; }}template<class T>T* CMyGraph<T>::DepthFirstSearch(const T& beginVertex) { T* DFS_visitList = new T[MAXSIZE]{}; stack<T> visitStack; int length = 0; T temp = beginVertex; while (1) { int k = getVertexPos(temp); if (-1 == k) { errorMessage(4); return nullptr; } int i = 0; for (; i < length; i++) { if (temp == DFS_visitList[i]) { break; } } if (i == length) { DFS_visitList[length] = temp; length++; for (int j = 0; j < numVertex; j++) { if (k == j) { continue; } else if (INFINITE != edge[k][j]) { visitStack.push(vertexArray[j]); } } } if (visitStack.empty()) { return DFS_visitList; } temp = visitStack.top(); visitStack.pop(); }}template<class T>T * CMyGraph<T>::BreathFirestSearch(const T & beginVertex){ queue<T> visitQueue; int length = 0; T* BFS_visitList = new T[MAXSIZE]{}; T Temp = beginVertex; while (1) { int k = getVertexPos(Temp); if (-1 == k) { errorMessage(4); return nullptr; } int i = 0; for (; i < length; i++) { if (Temp == BFS_visitList[i]) { break; } } if (i == length) { BFS_visitList[length] = Temp; length++; for (int i = 0; i < numVertex; i++) { if (k == i) { continue; } else if (INFINITE != edge[k][i]) { visitQueue.push(vertexArray[i]); } } } if (visitQueue.empty()) { return BFS_visitList; } Temp = visitQueue.front(); visitQueue.pop(); }}template<class T>bool CMyGraph<T>::PathConnect(const T & vertex1, const T & vertex2){ T* list = DepthFirstSearch(vertex1); if (nullptr == list) { return false; } while (NULL != *list) { if (vertex2 == *list) { return true; } list++; } return false;}
源.cpp
#include "MyGraph.h"#include "MyGraph.cpp"void main() { CMyGraph<char> mg; mg.InsertVertex('a'); mg.InsertVertex('b'); mg.InsertVertex('c'); mg.InsertVertex('d'); mg.InsertVertex('e'); mg.DeleteVertex('a'); mg.InsertEdge('a', 'b', 10); mg.InsertEdge('b', 'c', 20); mg.InsertEdge('b', 'd', 12); mg.InsertEdge('d', 'e', 65); mg.Display(); cout << "---" << endl; cout << "深度优先遍历:"; char* DFS_List = mg.DepthFirstSearch('a'); if (nullptr != DFS_List) { cout << DFS_List << endl; } cout << "---" << endl; cout << "广优先遍历:"; char* BFS_List = mg.BreathFirestSearch('a'); if (nullptr != BFS_List) { cout << BFS_List << endl; } cout << "---" << endl; cout << "a,e是否连通: "<< mg.PathConnect('a','e') << endl; cout << "e,a是否连通: " << mg.PathConnect('e', 'a') << endl; system("pause");}
0 1
- 【数据结构与算法】带权有向图
- 数据结构与算法之有向图的拓扑排序
- java数据结构与算法-有向图的拓扑排序
- (c++)数据结构与算法之图:Dijkstra、Floyd算法、判断有向图回路
- 浅析数据结构与算法12--无向图相关算法基础
- 【数据结构】有向图->dijkstra算法详解
- 算法与数据结构基础8:C++实现有向图——邻接表存储
- 算法与数据结构基础9:C++实现有向图——邻接矩阵存储
- 《数据结构与算法》学习笔记30 有向图的拓扑排序
- 【数据结构与算法】 PROJECT 3 有向图的最短路径实现 之 知识点
- 【数据结构与算法】 有向图的最短路径实现
- 【数据结构与算法】图
- 数据结构与算法--图
- 数据结构与算法:图
- 数据结构与算法:图
- 数据结构——带权有向图(最短路径算法Dijkstra算法)
- 浅谈算法和数据结构----无向图相关算法基础
- (c++)数据结构与算法之图:无向图两点间路径、判断环、破圈法构造最小生成树
- 欧拉函数
- java解惑(一)—表达式之谜
- RecyclerView嵌套问题ScrollView
- 自定义View起步:自定义属性二
- 服务器、客户端实例(C#)
- 【数据结构与算法】带权有向图
- 通讯录管理软件的设计C++实现(含源代码)
- 2017第八届蓝桥杯C/C++ B组省赛题解
- NodeMCU读取dht11温湿度网页显示
- MySQL语法知识点
- 1012 u Calculate e
- JAVA基础易错选择题(笔试题文件流部分)
- 图的遍历-邻接矩阵-dfs
- HDU 5299 L