本章是通过C++实现邻接矩阵无向图。

目录
1. 邻接矩阵无向图的介绍
2. 邻接矩阵无向图的代码说明
3. 邻接矩阵无向图的完整源码

转载请注明出处:http://www.cnblogs.com/skywang12345/

更多内容:数据结构与算法系列 目录

邻接矩阵无向图的介绍

邻接矩阵无向图是指通过邻接矩阵表示的无向图。

上面的图G1包含了"A,B,C,D,E,F,G"共7个顶点,而且包含了"(A,C),(A,D),(A,F),(B,C),(C,D),(E,G),(F,G)"共7条边。由于这是无向图,所以边(A,C)和边(C,A)是同一条边;这里列举边时,是按照字母先后顺序列举的。

上图右边的矩阵是G1在内存中的邻接矩阵示意图。A[i][j]=1表示第i个顶点与第j个顶点是邻接点,A[i][j]=0则表示它们不是邻接点;而A[i][j]表示的是第i行第j列的值;例如,A[1,2]=1,表示第1个顶点(即顶点B)和第2个顶点(C)是邻接点。

邻接矩阵无向图的代码说明

1. 基本定义

  1. class MatrixUDG {
  2. private:
  3. char mVexs[MAX]; // 顶点集合
  4. int mVexNum; // 顶点数
  5. int mEdgNum; // 边数
  6. int mMatrix[MAX][MAX]; // 邻接矩阵
  7. public:
  8. // 创建图(自己输入数据)
  9. MatrixUDG();
  10. // 创建图(用已提供的矩阵)
  11. MatrixUDG(char vexs[], int vlen, char edges[][2], int elen);
  12. ~MatrixUDG();
  13. // 打印矩阵队列图
  14. void print();
  15. private:
  16. // 读取一个输入字符
  17. char readChar();
  18. // 返回ch在mMatrix矩阵中的位置
  19. int getPosition(char ch);
  20. };

MatrixUDG是邻接矩阵对应的结构体。
mVexs用于保存顶点,mVexNum是顶点数,mEdgNum是边数;mMatrix则是用于保存矩阵信息的二维数组。例如,mMatrix[i][j]=1,则表示"顶点i(即mVexs[i])"和"顶点j(即mVexs[j])"是邻接点;mMatrix[i][j]=0,则表示它们不是邻接点。

2. 创建矩阵

这里介绍提供了两个创建矩阵的方法。一个是用已知数据,另一个则需要用户手动输入数据

2.1 创建图(用已提供的矩阵)

  1. /*
  2. * 创建图(用已提供的矩阵)
  3. *
  4. * 参数说明:
  5. * vexs -- 顶点数组
  6. * vlen -- 顶点数组的长度
  7. * edges -- 边数组
  8. * elen -- 边数组的长度
  9. */
  10. MatrixUDG::MatrixUDG(char vexs[], int vlen, char edges[][2], int elen)
  11. {
  12. int i, p1, p2;
  13. // 初始化"顶点数"和"边数"
  14. mVexNum = vlen;
  15. mEdgNum = elen;
  16. // 初始化"顶点"
  17. for (i = 0; i < mVexNum; i++)
  18. mVexs[i] = vexs[i];
  19. // 初始化"边"
  20. for (i = 0; i < mEdgNum; i++)
  21. {
  22. // 读取边的起始顶点和结束顶点
  23. p1 = getPosition(edges[i][0]);
  24. p2 = getPosition(edges[i][1]);
  25. mMatrix[p1][p2] = 1;
  26. mMatrix[p2][p1] = 1;
  27. }
  28. }

该函数的作用是利用已知数据来创建一个邻接矩阵无向图。 实际上,在本文的测试程序源码中,该方法创建的无向图就是上面图G1。具体的调用代码如下:

  1. char vexs[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};
  2. char edges[][2] = {
  3. {'A', 'C'},
  4. {'A', 'D'},
  5. {'A', 'F'},
  6. {'B', 'C'},
  7. {'C', 'D'},
  8. {'E', 'G'},
  9. {'F', 'G'}};
  10. int vlen = sizeof(vexs)/sizeof(vexs[0]);
  11. int elen = sizeof(edges)/sizeof(edges[0]);
  12. MatrixUDG* pG;
  13. pG = new MatrixUDG(vexs, vlen, edges, elen);

2.2 创建图(自己输入)

  1. /*
  2. * 创建图(自己输入数据)
  3. */
  4. MatrixUDG::MatrixUDG()
  5. {
  6. char c1, c2;
  7. int i, p1, p2;
  8. // 输入"顶点数"和"边数"
  9. cout << "input vertex number: ";
  10. cin >> mVexNum;
  11. cout << "input edge number: ";
  12. cin >> mEdgNum;
  13. if ( mVexNum < 1 || mEdgNum < 1 || (mEdgNum > (mVexNum * (mVexNum-1))))
  14. {
  15. cout << "input error: invalid parameters!" << endl;
  16. return ;
  17. }
  18. // 初始化"顶点"
  19. for (i = 0; i < mVexNum; i++)
  20. {
  21. cout << "vertex(" << i << "): ";
  22. mVexs[i] = readChar();
  23. }
  24. // 初始化"边"
  25. for (i = 0; i < mEdgNum; i++)
  26. {
  27. // 读取边的起始顶点和结束顶点
  28. cout << "edge(" << i << "): ";
  29. c1 = readChar();
  30. c2 = readChar();
  31. p1 = getPosition(c1);
  32. p2 = getPosition(c2);
  33. if (p1==-1 || p2==-1)
  34. {
  35. cout << "input error: invalid edge!" << endl;
  36. return ;
  37. }
  38. mMatrix[p1][p2] = 1;
  39. mMatrix[p2][p1] = 1;
  40. }
  41. }

该函数是通过读取用户的输入,而将输入的数据转换成对应的无向图。

邻接矩阵无向图的完整源码

点击查看:源代码

邻接矩阵无向图(二)之 C++详解的更多相关文章

  1. 邻接矩阵无向图(三)之 Java详解

    前面分别介绍了邻接矩阵无向图的C和C++实现,本文通过Java实现邻接矩阵无向图. 目录 1. 邻接矩阵无向图的介绍 2. 邻接矩阵无向图的代码说明 3. 邻接矩阵无向图的完整源码 转载请注明出处:h ...

  2. 邻接矩阵有向图(二)之 C++详解

    本章是通过C++实现邻接矩阵有向图. 目录 1. 邻接矩阵有向图的介绍 2. 邻接矩阵有向图的代码说明 3. 邻接矩阵有向图的完整源码 转载请注明出处:http://www.cnblogs.com/s ...

  3. 邻接表无向图(二)之 C++详解

    本章是通过C++实现邻接表无向图. 目录 1. 邻接表无向图的介绍 2. 邻接表无向图的代码说明 3. 邻接表无向图的完整源码 转载请注明出处:http://www.cnblogs.com/skywa ...

  4. 数据结构图文解析之:二叉堆详解及C++模板实现

    0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...

  5. Java进阶(三十二) HttpClient使用详解

    Java进阶(三十二) HttpClient使用详解 Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们 ...

  6. Spring Boot 启动(二) 配置详解

    Spring Boot 启动(二) 配置详解 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) Spring Boot 配置 ...

  7. Android ADB命令教程二——ADB命令详解

    Android ADB命令教程二——ADB命令详解 转载▼ 原文链接:http://www.tbk.ren/article/249.html       我们使用 adb -h 来看看,adb命令里面 ...

  8. 转:JAVAWEB开发之权限管理(二)——shiro入门详解以及使用方法、shiro认证与shiro授权

    原文地址:JAVAWEB开发之权限管理(二)——shiro入门详解以及使用方法.shiro认证与shiro授权 以下是部分内容,具体见原文. shiro介绍 什么是shiro shiro是Apache ...

  9. MySQL慢查询(二) - pt-query-digest详解慢查询日志 pt-query-digest 慢日志分析

    随笔 - 66 文章 - 0 评论 - 19 MySQL慢查询(二) - pt-query-digest详解慢查询日志 一.简介 pt-query-digest是用于分析mysql慢查询的一个工具,它 ...

随机推荐

  1. CSS浮动(float,clear)通俗讲解

    首先要知道,div是块级元素,在页面中独占一行,自上而下排列,也就是传说中的流.如下图: 可以看出,即使div1的宽度很小,页面中一行可以容下div1和div2,div2也不会排在div1后边,因为d ...

  2. inno 实现水波特效

    安装Inno Setup时如果选择了水波效果插件(如下图),将在Inno Setup的安装目录下自带有水波特效的例子,如路径:C:\Program Files (x86)\Inno Setup 5\E ...

  3. Perst常用命令

    Perst我使用的版本是4, 几乎支持所有的.net环境, 而且效率很高,比较稳定. 使用方法: 1:引用相应dll 2: 创建数据结构 public class Cp_struct : Persis ...

  4. 蛙蛙推荐:AngularJS学习笔记

    为了降低前端代码的数量,提高可维护性,可测试性,学习了下AngularJS,正在准备投入项目开发中. AngularJS的概念比较多,如果面向对象方面的书理解的不透的话学习起来有些费劲,它的官方有个快 ...

  5. libQtCassandra 0.5.0 发布

    libQtCassandra 0.5.0 修复了 QCassandraRow::exists() 函数的问题,更新了 Thrift 库. libQtCassandra 是一个高级的 C++ 库用来访问 ...

  6. C++ REST SDK的基本用法

    微软开发了一个开源跨平台的http库--C++ REST SDK(http://casablanca.codeplex.com/),又名卡萨布兰卡Casablanca,有个电影也叫这个名字,也许这个库 ...

  7. Linux 2.6 源码学习-内存管理-buddy算法

    核心数据结构 linux 2.6 的内存管理支持NUMA(Non Uniform Memory Access Achitecture),即非一致内存访问体系,在该体系中存在多个CPU,并且拥有分离的存 ...

  8. 设计模式之美:Product Trader(操盘手)

    索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):Product Trader 的示例实现. 意图 使客户程序可以通过命名抽象超类和给定规约来创建对象. Product Trad ...

  9. Guava 并行 Futures实例

    Future可以用来构建复杂的异步操作,方法不是返回一个值,而是一个Future对象.创建Future对象的过程(比如调用Future异步函数接口),不会阻塞当前线程操作,而且对象第一个次创建没有值, ...

  10. Android Fragment add/replace以及backstack

    无论Fragment以何种方式加入,都不会影响backstack,backstack由addToBackStack函数决定,只有调用了这个函数,才会将Fragment加入返回栈.这个说法其实不太准确, ...