当前位置:   article > 正文

【数据结构】图的邻接矩阵存储实现_设计一数据结构,用来表示图的邻接矩阵存储结构

设计一数据结构,用来表示图的邻接矩阵存储结构

图的邻接表存储实现:http://blog.csdn.net/wenqian1991/article/details/24667287

图的邻接表DFS和BFS算法:http://blog.csdn.net/wenqian1991/article/details/24812393

这里则介绍图的另外一种存储方式:邻接矩阵。参考资料《大话数据结构》《C算法:卷二》

一、图的数据结构

图的邻接矩阵存储方式是用两个数据来表示。一个一维数组存储图中顶点信息,一个二维数组(称为邻接矩阵)存储图中的边的信息。

见下图:(图片来源于《大话数据结构》)

                  

  1. /*图的邻接矩阵存储*/
  2. typedef int VertexType;
  3. typedef int EdgeType;
  4. #define MAXVEX 100
  5. #define INFI 65535
  6. typedef struct
  7. {
  8. VertexType vexs[MAXVEX]; /*顶点表*/
  9. EdgeType matrix[MAXVEX][MAXVEX]; /*邻接矩阵*/
  10. unsigned int numVertexes; /*顶点数*/
  11. unsigned int numEdges; /*边数*/
  12. }Graph;
二、创建一个图

  1. /*创建一个邻接矩阵无向图*/
  2. Graph* CreateGraph()
  3. {
  4. Graph *pGragh = new Graph;
  5. if (NULL == pGragh)
  6. return NULL;
  7. cout << "输入顶点数和边数:" << endl;
  8. cin >> pGragh->numVertexes >> pGragh->numEdges;
  9. for (int i = 0; i < pGragh->numVertexes; ++i)/*建立顶点表*/
  10. (pGragh->vexs)[i] = i;
  11. for (int i = 0; i < pGragh->numVertexes; ++i)/*邻接矩阵初始化*/
  12. {
  13. for (int j = 0; j < pGragh->numVertexes; ++j)
  14. {
  15. (pGragh->matrix)[i][j] = INFI;
  16. if (i == j)
  17. (pGragh->matrix)[i][j] = 0;
  18. }
  19. }
  20. for (int k = 0; k < pGragh->numEdges; ++k)
  21. {
  22. int i, j, w;
  23. cout << "输入边(vi,vj)上的下标i,下标j和权重w:" << endl;
  24. cin >> i >> j >> w;
  25. (pGragh->matrix)[i][j] = w;
  26. (pGragh->matrix)[j][i] = (pGragh->matrix)[i][j];//无向图是对称矩阵
  27. }
  28. return pGragh;
  29. }
  1. /*创建一个邻接矩阵有向图*/
  2. Graph* CreateDiGraph()
  3. {
  4. Graph *pGragh = new Graph;
  5. if (NULL == pGragh)
  6. return NULL;
  7. cout << "输入顶点数和边数:" << endl;
  8. cin >> pGragh->numVertexes >> pGragh->numEdges;
  9. for (int i = 0; i < pGragh->numVertexes; ++i)/*建立顶点表*/
  10. (pGragh->vexs)[i] = i;
  11. for (int i = 0; i < pGragh->numVertexes; ++i)/*邻接矩阵初始化*/
  12. {
  13. for (int j = 0; j < pGragh->numVertexes; ++j)
  14. {
  15. (pGragh->matrix)[i][j] = INFI;
  16. if (i == j)
  17. (pGragh->matrix)[i][j] = 0;
  18. }
  19. }
  20. for (int k = 0; k < pGragh->numEdges; ++k)
  21. {
  22. int i, j, w;
  23. cout << "输入边<vi,vj>上的下标i,下标j和权重w:" << endl;
  24. cin >> i >> j >> w;
  25. (pGragh->matrix)[i][j] = w;//清楚上面输入的顺序,有向边的开始点和终点
  26. }
  27. return pGragh;
  28. }
三、检查图中两个顶点间是否有边

  1. /*检查两个顶点之间是否有边
  2. 对于邻接矩阵存储图,这比较简单。其中有向图对输入顶点顺序有要求*/
  3. bool GraphHasEdge(Graph *pGraph, unsigned int begin, unsigned int end)
  4. {
  5. if (NULL == pGraph || begin >= pGraph->numVertexes || end >= pGraph->numVertexes)
  6. return false;
  7. if (begin == end)
  8. return false;
  9. return ((pGraph->matrix)[begin][end] != INFI) ? true : false;
  10. }

四、DFS

关于DFS与BFS的介绍见开篇链接

  1. /*DFS*/
  2. /*邻接矩阵的深度优先递归算法*/
  3. void DFSUtil(Graph *pGraph, int start, bool visited[])
  4. {
  5. visited[start] = true;
  6. cout << start << endl;
  7. for (int j = 0; j < pGraph->numVertexes; ++j)
  8. {
  9. if ((pGraph->matrix)[start][j] != 0 && (pGraph->matrix)[start][j] != INFI && !visited[j])
  10. DFSUtil(pGraph, j, visited);
  11. }
  12. }
  13. /*邻接矩阵的深度优先搜索*/
  14. void DFS(Graph *pGraph)
  15. {
  16. if (NULL == pGraph)
  17. return;
  18. bool *visited = new bool[pGraph->numVertexes];
  19. memset(visited, false, pGraph->numVertexes);
  20. for (int i = 0; i < pGraph->numVertexes; ++i)
  21. {
  22. if (!visited[i])
  23. DFSUtil(pGraph, i, visited);
  24. }
  25. delete[] visited;
  26. }
五、BFS
  1. /*BFS*/
  2. void BFS(Graph *pGraph)
  3. {
  4. if (NULL == pGraph)
  5. return;
  6. bool *visited = new bool[pGraph->numVertexes];
  7. memset(visited, false, pGraph->numVertexes);
  8. list<int> queue;//利用链表构造一个队列
  9. for (int i = 0; i < pGraph->numVertexes; ++i)
  10. {
  11. if (!visited[i])
  12. {
  13. visited[i] = true;
  14. cout << pGraph->vexs[i] << endl;
  15. queue.push_back(i);
  16. while (!queue.empty())
  17. {
  18. i = *queue.begin();
  19. queue.pop_front();
  20. for (int j = 0; j < pGraph->numVertexes; ++j)
  21. {
  22. if ((pGraph->matrix)[i][j] != 0 && (pGraph->matrix)[i][j] != INFI && !visited[j])
  23. {
  24. visited[j] = true;
  25. cout << pGraph->vexs[j] << endl;
  26. queue.push_back(j);
  27. }
  28. }
  29. }
  30. }
  31. }
  32. }
这里只提供相关代码实现,代码已测试,理论部分请参考相关资料。




本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/128053
推荐阅读
相关标签
  

闽ICP备14008679号