• c++数据结构:图(邻接矩阵)


    设计图常用的数据模型:

    • 邻接矩阵(数组)
    • 邻接表 (链表)
    • 邻接多重表(链表)
    • 十字链表(链表)

    图的邻接矩阵表示法:

    1. 用以个一维数组来存放节点
    2. 用一个二维数组(矩阵)来存放节点之间的关系

    有n个顶点,创建一个n*n的矩阵,矩阵的每一行对应每个顶点的关系,当两点有弧时,对应的点为1,没有的话则为0。 

    邻接矩阵的优缺点:

    • 优点:结构简单,易理解,易找顶点的边,方便获取节点的度
    • 缺点:所需内存大,且不易添加和删除顶点
    • 时间复杂度:O(n^2+e*n)
    • 空间复杂度:O(n^2)

     

    有向图的度:改行和该列所含1的个数

    1. 出度为改行的:1的个数
    2. 入度为该列的:1的个数 

    无向图的度:就是该行所在的 1的个数 

    网的话是把 0变为∞,把1变为权值

    邻接矩阵的核心结构为:

    1. class Adj_matrix
    2. {
    3. int vexs[Max_Vertex_Num];//顶点向量
    4. ArcCell arcs[Max_Vertex_Num][Max_Vertex_Num];//邻接矩阵
    5. int vexnum;//顶点数量
    6. int arcnum;//弧的数量
    7. };

    邻接矩阵的实现:(只是简单实现)

    1. #define INFINITY INT_MAX //最大值∞
    2. #define Max_Num 50//最多50个顶点
    3. class Adj_matrix
    4. {
    5. private:
    6. char vexs[Max_Num];//顶点向量
    7. int arcs[Max_Num][Max_Num];//邻接矩阵
    8. int vexnum;//顶点数量
    9. int arcnum;//弧的数量
    10. public:
    11. int find_num(char a);//寻找顶点位置
    12. void add_UDN();//生成无向网
    13. };

    1.无向网的实现: 

    1. int Adj_matrix::find_num(char a)寻找顶点位置
    2. {
    3. for (int i = 0; i < vexnum; i++)
    4. {
    5. if (vexs[i] == a)//如果数组中查找到下标
    6. return i;//返回下标
    7. }
    8. return -1;//没有则返回-1
    9. }
    10. void Adj_matrix::add_UDN()//生成无向网
    11. {
    12. cin >> vexnum >> arcnum;//输入顶点数和弧的数量,顶点数<=50,弧的数量<1/2*50*49
    13. for (int i = 0; i < vexnum; i++)
    14. {
    15. char p;
    16. cin >> p;//输入顶点
    17. vexs[i] = p;//存储顶点
    18. }
    19. for (int i = 0; i < vexnum; i++)//初始化矩阵
    20. {
    21. for (int j = 0; j < vexnum; j++)
    22. {
    23. arcs[i][j] = INFINITY;//全部置为 无穷大
    24. }
    25. }
    26. for (int i = 0; i < arcnum; i++)//处理边的关系,存放权值
    27. {
    28. char n;
    29. char m;//用来存储顶点信息
    30. int x;//保存权值
    31. cin >> n >> m >> x;//键盘输入顶点信息
    32. //寻找顶点在数组的位置
    33. arcs[find_num(n)][find_num(m)] = x;//放入权值
    34. arcs[find_num(m)][find_num(n)] = x;//放入权值
    35. }
    36. }

    2.有向网与无向网类似就不列举了

    把无向网代码最后一行删掉就行

    3.无向图的实现 

    1. void Adj_matrix::add_DU()//生成无向图
    2. {
    3. cin >> vexnum >> arcnum;//键盘输入顶点和弧的数量
    4. for (int i = 0; i < vexnum; i++)
    5. {
    6. cin >> vexs[i];//输入顶点
    7. }
    8. for (int i = 0; i < vexnum; i++)//初始化矩阵
    9. {
    10. for (int j = 0; j < vexnum; j++)
    11. {
    12. arcs[i][j] = 0;//全部初始化为0
    13. }
    14. }
    15. for (int i = 0; i < arcnum; i++)//
    16. {
    17. char n;
    18. char m;//用来存储顶点信息
    19. cin >> n >>m;
    20. //寻找顶点在数组的位置
    21. arcs[find_num(n)][find_num(m)] = 1;//放入1
    22. arcs[find_num(m)][find_num(n)] = 1;//放入1
    23. }
    24. }

    4.有向图与无向图类似就不列举了

    把无向图代码最后一行删掉就行

  • 相关阅读:
    数组 冒泡排序
    数据结构与算法之美读书笔记15
    vs调试技巧(详细)
    产品市场研究的方法有哪些
    STC15单片机-低功耗设计
    Android设备搭建http服务器AndServer
    软考__第17章 战略管理
    Flink学习第四天——完成第一个Flink 流批一体案例
    前端研习录(33)——命令行工具|ECMAScript6简介|Nodejs安装|Babel转码器安装及基本用法详解及示例分析
    selenium基础+环境配置
  • 原文地址:https://blog.csdn.net/qq_45303986/article/details/127401102