1. 演示

无向图:

有向网:

2. 代码

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

    目录 1.选择自定义分区 2.分配boot分区 3.创建LVM物理卷 4.生成卷组 5.创建逻辑卷 6.格式化安装 我们先用新安装Linux系统时的图形化界面,来演示一下LVM逻辑卷如何进行分区. 提 ...

  2. 零基础学习java------21---------动态代理,java8新特性(lambda, stream,DateApi)

    1. 动态代理 在一个方法前后加内容,最简单直观的方法就是直接在代码上加内容(如数据库中的事务),但这样写不够灵活,并且代码可维护性差,所以就需要引入动态代理 1.1 静态代理实现 在讲动态代理之前, ...

  3. jquery datatable使用简单示例

    目标: 使用 jQuery Datatable 构造数据列表,并且增加或者隐藏相应的列,已达到数据显示要求.同时, jQuery Datatable 强大的功能支持:排序,分页,搜索等. Query ...

  4. 使用NSURLSessionDataTask实现大文件离线断点下载(完整)

    6.1 涉及知识点(1)关于NSOutputStream的使用 //1. 创建一个输入流,数据追加到文件的屁股上 //把数据写入到指定的文件地址,如果当前文件不存在,则会自动创建 NSOutputSt ...

  5. 【Spring Framework】Spring入门教程(七)Spring 事件

    内置事件 Spring中的事件是一个ApplicationEvent类的子类,由实现ApplicationEventPublisherAware接口的类发送,实现ApplicationListener ...

  6. .net 5 开发部署B/S程序。

    现在.net 6 已经出来了,visualStudio 2022也发行预览版了. 自 .net5 发布,.net core 与.net framework 已经走向统一.确实越来越好用了. 现在.ne ...

  7. Netty 编解码奥秘

    Netty中编解码 Netty 的解码器有很多种,比如基于长度的,基于分割符的,私有协议的.但是,总体的思路都是一致的. 拆包思路:当数据满足了 解码条件时,将其拆开.放到数组.然后发送到业务 han ...

  8. 转:addChildViewController实现网易新闻首页切换

    本来只是打算介绍一下addChildViewController这个方法的,正好今天朋友去换工作面试问到网易新闻标签栏效果的实现,就结合它,用个小Demo实例介绍一下:(具体解释都写在了Demo里面的 ...

  9. 混沌映射初始化种群之Logistic映射

    Logstic混沌映射初始化种群 Step 1:     随机生成一个\(d\)维向量\({X_0}\),向量的每个分量在0-1之间. Step 2:     利用Logistic映射生成N个向量.L ...

  10. [BUUCTF]PWN——jarvisoj_level3

    jarvisoj_level3 附件 步骤 例行检查,32位,nx保护 运行一下程序 32位ida载入,shift+f12没有看到程序里有可以直接利用的后面函数,根据运行时的字符串找到了程序的关键函数 ...