1. 演示

无向图:

有向网:

2. 代码

  1. 1 #include <iostream>
  2. 2 #include <unordered_map>
  3. 3 #include <vector>
  4. 4 #include <string>
  5. 5 //storage graph by adjacency matrix
  6. 6 using std::unordered_map;
  7. 7 using std::vector;
  8. 8 using std::string;
  9. 9 enum graphType { UG, DG,UN,DN };       //无向图,有向图,无向网,有向网
  10. 10 class Graph{
  11. 11 public:
  12. 12 unordered_map<string,int> vertex2index; //顶点的名字 ==》下标
  13. 13 vector<vector<int>> edjes; //存储边的二维数组
  14. 14 int n, e; //顶点数和边数
  15. 15 enum graphType type; //图的类型
  16. 16 Graph(int vNum=1,int eNum=0,enum graphType t=UG):
  17. 17 n(vNum),e(eNum),type(t){}
  18. 18 Graph* createGraph();
  19. 19
  20. 20 void showGraph() {
  21. 21 std::cout << "开始显示图:\n";
  22. 22 auto ite = vertex2index.begin();
  23. 23 //打印节点名字横
  24. 24 std::cout << " ";
  25. 25 for (; ite!=vertex2index.end(); ite++) {
  26. 26 std::cout<<(*ite).first << " ";
  27. 27 }
  28. 28 std::cout << "\n";
  29. 29 //打印节点
  30. 30 ite = vertex2index.begin();
  31. 31 for (int i = 0; i < n; i++) {
  32. 32 //打印节点名字竖
  33. 33 std::cout << (*ite++).first << " ";
  34. 34 for (int j = 0; j < n; j++) {
  35. 35 //是默认填充则打印#,否则打印其权值
  36. 36 edjes[i][j] == INT_MAX ? std::cout << "# " : std::cout << edjes[i][j] << " ";
  37. 37 }
  38. 38 std::cout << "\n";
  39. 39 }
  40. 40 }
  41. 41 };
  42. 42 Graph* Graph::createGraph()
  43. 43 {
  44. 44 std::cout << "图的信息:\n顶点数:" << n << " 边数:" << e<<" 类型:";
  45. 45 switch (type) {
  46. 46 case UG:std::cout << "无向图\n"; break;
  47. 47 case DG:std::cout << "有向图\n"; break;
  48. 48 case UN:std::cout << "无向网\n"; break;
  49. 49 case DN:std::cout << "有向网\n"; break;
  50. 50 }
  51. 51 //根据顶点数来构造矩阵, 无边填充INT_MAX
  52. 52 for (int i = 0; i < n; i++) {
  53. 53 vector<int> temp(n, INT_MAX);
  54. 54 edjes.emplace_back(temp);
  55. 55 }
  56. 56 //填充顶点数组,确立顶点名字和下标的映射
  57. 57 for (int i = 0; i < n; i++) {
  58. 58 string name;
  59. 59 std::cout << "输入第" << i + 1 << "个顶点的名字(string):";
  60. 60 std::cin >> name;
  61. 61 vertex2index[name] = i;
  62. 62 }
  63. 63 //输入边的信息
  64. 64 for (int i = 0; i < e; i++) {
  65. 65 string n1, n2;
  66. 66 int pow = 1, row = 0, column = 0;
  67. 67 std::cout << "输入第" << i + 1;
  68. 68 if (type == UG || type == DG) { //UG或DG没有权值,默认显示为1
  69. 69 std::cout << "条边的弧头,弧尾:\n";
  70. 70 std::cin >> n1 >> n2;
  71. 71 }
  72. 72 else {
  73. 73 std::cout <<"条边的弧头,弧尾,权值:\n";     //UN或DN有权值
  74. 74 std::cin >> n1 >> n2 >> pow;
  75. 75 }
  76. 76 row = vertex2index[n1]; column = vertex2index[n2]; //根据边的名字找到对应下标
  77. 77 edjes[row][column] = pow;
  78. 78 type == UG || type == UN ?edjes[column][row] = pow : 1; //如果是UG或UN则对角线对称
  79. 79 }
  80. 80
  81. 81 return this;
  82. 82 }
  83. 83 int main()
  84. 84 {
  85. 85 //示例:6节点10边有向网
  86. 86 Graph *g = new Graph(6,10,DN);
  87. 87 g->createGraph();
  88. 88 g->showGraph();
  89. 89 std::cin.get();
  90. 90 }

图的存储:邻接矩阵(C++)的更多相关文章

  1. C++编程练习(9)----“图的存储结构以及图的遍历“(邻接矩阵、深度优先遍历、广度优先遍历)

    图的存储结构 1)邻接矩阵 用两个数组来表示图,一个一维数组存储图中顶点信息,一个二维数组(邻接矩阵)存储图中边或弧的信息. 2)邻接表 3)十字链表 4)邻接多重表 5)边集数组 本文只用代码实现用 ...

  2. 图的存储结构(邻接矩阵与邻接表)及其C++实现

    一.图的定义 图是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为: G=(V,E) 其中:G表示一个图,V是图G中顶点的集合,E是图G中顶点之间边的集合. 注: 在线性表中,元素个数可以为零, ...

  3. 图的存储及遍历 深度遍历和广度遍历 C++代码实现

    /*图的存储及遍历*/ #include<iostream> using namespace std; //----------------------------------- //邻接 ...

  4. 图的存储,搜索,遍历,广度优先算法和深度优先算法,最小生成树-Java实现

    1)用邻接矩阵方式进行图的存储.如果一个图有n个节点,则可以用n*n的二维数组来存储图中的各个节点关系. 对上面图中各个节点分别编号,ABCDEF分别设置为012345.那么AB AC AD 关系可以 ...

  5. K:图的存储结构

      常用的图的存储结构主要有两种,一种是采用数组链表(邻接表)的方式,一种是采用邻接矩阵的方式.当然,图也可以采用十字链表或者边集数组的方式来进行表示,但由于不常用,为此,本博文不对其进行介绍. 邻接 ...

  6. 【algo&ds】6.图及其存储结构、遍历

    1.什么是图 图表示"多对多"的关系 包含 一组顶点:通常用 V(Vertex)表示顶点集合 一组边:通常用 E(Edge)表示边的集合 边是顶点对:(v,w)∈ E,其中 v,w ...

  7. 【lhyaaa】图的存储&遍历

    呀,图真是一个令人头疼而又很重要的东西.在现实生活中,我们有很多的问题都不能用树来实现,所以烦人啊不伟大的图就出现了—— 图的存储 没有存储哪来的操作,所以存储是最基础的呢. 邻接矩阵 我们对于图的存 ...

  8. 【PHP数据结构】图的存储结构

    图的概念介绍得差不多了,大家可以消化消化再继续学习后面的内容.如果没有什么问题的话,我们就继续学习接下来的内容.当然,这还不是最麻烦的地方,因为今天我们只是介绍图的存储结构而已. 图的顺序存储结构:邻 ...

  9. 图的存储结构大赏------数据结构C语言(图)

    图的存储结构大赏------数据结构C语言(图) 本次所讲的是常有的四种结构: 邻接矩阵 邻接表 十字链表 邻接多重表 邻接矩阵 概念 两个数组,一个表示顶点的信息,一个用来表示关联的关系. 如果是无 ...

  10. 七牛云图床存储+Alfread工作流+使用QSHELL

    layout: post title: 七牛云图床存储+Alfread工作流+使用QSHELL 来源:http://www.cnblogs.com/cmi-sh-love/p/8901620.html ...

随机推荐

  1. 如何利用官方SDK文件来辅助开发

    如何利用官方SDK文件来辅助开发 1.首先要先知道什么是SDK? SDK或者SDK包指的是,半导体厂商针对自己研发的芯片,同步推出的一个软件开发工具包. 它可以简单的为某个程序设计语言提供应用程序接口 ...

  2. 【模板】Splay(伸展树)普通平衡树(数据加强版)/洛谷P6136

    题目链接 https://www.luogu.com.cn/problem/P6136 题目大意 需要写一种数据结构,来维护一些非负整数( \(int\) 范围内)的升序序列,其中需要提供以下操作: ...

  3. day12 查找文件

    day12 查找文件 find命令:查找文件 find命令:在linux系统中,按照我们的要求去查询文件. 格式: find [查询的路径] [匹配模式] [匹配规则] 匹配模式: -name : 按 ...

  4. day33 前端之css

    day33 前端之css css简介 CSS(Cascading Style Sheet,层叠样式表)定义如何显示HTML元素. # 语法结构 选择器 { 属性名1,属性值 属性名2,属性值 } # ...

  5. Flink(五) 【消费kafka】

    目录 0.目的 1.本地测试 2.线上测试 提交作业 0.目的 测试flink消费kafka的几种消费策略 kafkaSource.setStartFromEarliest() //从起始位置 kaf ...

  6. MySQL自我保护参数

    上文(MySQL自我保护工具--pt-kill )提到用pt-kill工具来kill相关的会话,来达到保护数据库的目的,本文再通过修改数据库参数的方式达到阻断长时间运行的SQL的目的. 1.参数介绍 ...

  7. mysql报错max_connections错误

    SELECT @@MAX_CONNECTIONS AS 'Max Connections';set GLOBAL max_connections=10000; show status like '%t ...

  8. Spring Cloud服务离线

    服务离线,即某服务不能对外提供服务了.服务离线的原因有两种:服务下架与服务下线.这两种方案都是基于Actuator监控器实现的. 服务下架:将注册到Eureka Server中的Eureka Clie ...

  9. 如何用shell脚本分析网站日志统计PV、404、500等数据

    以下shell脚本能统计出网站的总访问量,以及404,500出现的次数.统计出来后,可以结合监控宝来进行记录,进而可以看出网站访问量是否异常,是否存在攻击.还可以根据查看500出现的次数,进而判断网站 ...

  10. java实现文件压缩

    java实现文件压缩:主要是流与流之间的传递 代码如下: package com.cst.klocwork.service.zip; import java.io.File; import java. ...