当前位置:   article > 正文

<图>邻接矩阵(有向)_有向图的邻接矩阵

有向图的邻接矩阵
  1. 图的存储结构
  2. 1.顺序存储
  3. 邻接矩阵adjacency_matrix表示顶点之间的关系
  4. 缺点:迅速判断两个节点之间是否有边,方便计算各个顶点之间的度
  5. 优点:不方便图中顶点的增加个删除,不方便访问各个邻接点
  6. 需要两个数组来储存图。
  7. 一维数组储存顶点信息
  8. 二维数组储存顶点和顶点之间的邻接关系即边 notice:
  9. a -- b
  10. | / | 4个顶点,5条边
  11. d -- c
  12. vex[] = a b c d
  13. a b c d
  14. Edge[i][j] = a 0 1 0 1
  15. b 1 0 1 1
  16. c 0 1 0 1
  17. d 1 1 1 0
  18. 1.对称阵 Edge[i][j] == Edge[j][i]
  19. 2.第i行或第i列所有非0元素的个数 == 顶点的度
  20. -------------------------------------
  21. b
  22. ↗ ↖
  23. a → c 5个顶点,7条边
  24. ↓ ↙ ↓
  25. e ← d
  26. Vex[] = a b c d e
  27. a b c d e
  28. Egde[i][j] = a 0 1 1 0 1
  29. b 0 0 1 0 0
  30. c 0 0 0 1 1
  31. d 0 0 0 0 1
  32. e 0 0 0 0 0
  33. 1.不一定是对称
  34. 2.第i行非零元素的个数 == 第i个顶点的出度
  35. 3.第i列非零元素的个数 == 第i个顶点的入度
  36. --------------------------------------
  37. 5
  38. a → b
  39. 2 ↑ ↓ 4
  40. d ← c
  41. 3
  42. Vex[] = a b c d
  43. a b c d
  44. Egde[i][j] = a -1 5 -1 -1
  45. b -1 -1 4 -1
  46. c -1 -1 -1 3
  47. d 2 -1 -1 -1
  48. 2.链式存储
  49. 邻接表
  1. #include "directed_mat.h"
  2. int main()
  3. {
  4. struct AMG_Graph* ud_graph;
  5. ud_graph = Create_AMG_Graph();
  6. Show_AMG_Graph(ud_graph);
  7. return 0;
  8. }

directed_mat.cpp

  1. #include <iostream>
  2. #include "directed_mat.h"
  3. using namespace std;
  4. struct AMG_Graph* Create_AMG_Graph(void)
  5. {
  6. int i, j;
  7. char u, v;
  8. struct AMG_Graph* graph;
  9. // 申请内存空间,结构体多大申请多大,强制类型转换
  10. graph = (struct AMG_Graph *)malloc(sizeof(struct AMG_Graph));
  11. cout << "请输入顶点的个数: ";
  12. cin >> graph->vex_num;
  13. cout << "请输入边的个数: ";
  14. cin >> graph->edge_num;
  15. cout << "请输入顶点信息: " << endl;
  16. for(i = 0; i < graph->vex_num; i++)
  17. {
  18. cin >> graph->Vex[i];
  19. }
  20. for(i = 0; i < graph->vex_num; i++)
  21. {
  22. for(j = 0; j < graph->vex_num; j++)
  23. {
  24. // 初始化为0
  25. graph->Edge[i][j] = 0;
  26. }
  27. }
  28. while(graph->edge_num--)
  29. {
  30. cout << "请输入通过边连接起来的顶点:" << endl;
  31. cin >> u;
  32. cin >> v;
  33. // 到graph中找到字符u,所对应的索引
  34. i = search_vex(graph, u);
  35. j = search_vex(graph, v);
  36. if(i != -1 && j != -1)
  37. // 有向图为非对称的二维邻接矩阵
  38. graph->Edge[i][j] = 1;
  39. else
  40. {
  41. cout << "你输入的顶点信息是错的,请再次输入" << endl;
  42. graph->edge_num++;
  43. }
  44. }
  45. return graph;
  46. }
  47. void Show_AMG_Graph(struct AMG_Graph * graph)
  48. {
  49. int i,j;
  50. cout << "显示顶点信息:"<< endl;
  51. for(i = 0; i < graph->vex_num; i++)
  52. cout << graph->Vex[i] << "\t";
  53. cout << endl;
  54. cout << "显示邻接矩阵:" << endl;
  55. for(i = 0; i < graph->vex_num; i++)
  56. {
  57. for(j = 0; j < graph->vex_num; j++)
  58. {
  59. cout << graph->Edge[i][j] << "\t";
  60. }
  61. cout << endl;
  62. }
  63. }
  64. int search_vex(struct AMG_Graph* graph, char c)
  65. {
  66. int i;
  67. // o(n)
  68. for(i = 0; i < graph->vex_num; i++)
  69. {
  70. if(c == graph->Vex[i])
  71. return i;
  72. }
  73. return -1;
  74. }

directed_mat.h

  1. #ifndef __directed_mat_h__
  2. #define __directed_mat_h__
  3. #define MAX 100
  4. // 图结构,代表一整张图
  5. struct AMG_Graph
  6. {
  7. // 顶点的个数,边的个数
  8. int vex_num, edge_num;
  9. // 储存顶点的信息的一维数组
  10. char Vex[MAX];
  11. // 储存顶点和顶点之间的邻接关系,二维矩阵
  12. int Edge[MAX][MAX];
  13. };
  14. struct AMG_Graph* Create_AMG_Graph(void);
  15. void Show_AMG_Graph(struct AMG_Graph * graph);
  16. int search_vex(struct AMG_Graph* graph, char c);
  17. #endif

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/873989
推荐阅读
相关标签
  

闽ICP备14008679号