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

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

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

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

邻接矩阵有向图的介绍

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

上面的图G2包含了"A,B,C,D,E,F,G"共7个顶点,而且包含了"<A,B>,<B,C>,<B,E>,<B,F>,<C,E>,<D,C>,<E,B>,<E,D>,<F,G>"共9条边。

上图右边的矩阵是G2在内存中的邻接矩阵示意图。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. #define MAX 100
  2. class MatrixDG {
  3. private:
  4. char mVexs[MAX]; // 顶点集合
  5. int mVexNum; // 顶点数
  6. int mEdgNum; // 边数
  7. int mMatrix[MAX][MAX]; // 邻接矩阵
  8. public:
  9. // 创建图(自己输入数据)
  10. MatrixDG();
  11. // 创建图(用已提供的矩阵)
  12. MatrixDG(char vexs[], int vlen, char edges[][2], int elen);
  13. ~MatrixDG();
  14. // 打印矩阵队列图
  15. void print();
  16. private:
  17. // 读取一个输入字符
  18. char readChar();
  19. // 返回ch在mMatrix矩阵中的位置
  20. int getPosition(char ch);
  21. };

MatrixDG是邻接矩阵有向图对应的结构体。

mVexs用于保存顶点,mVexNum是顶点数,mEdgNum是边数;mMatrix则是用于保存矩阵信息的二维数组。例如,mMatrix[i][j]=1,则表示"顶点i(即mVexs[i])"和"顶点j(即mVexs[j])"是邻接点,且顶点i是起点,顶点j是终点。

2. 创建矩阵

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

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

  1. /*
  2. * 创建图(用已提供的矩阵)
  3. *
  4. * 参数说明:
  5. * vexs -- 顶点数组
  6. * vlen -- 顶点数组的长度
  7. * edges -- 边数组
  8. * elen -- 边数组的长度
  9. */
  10. MatrixDG::MatrixDG(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. }
  27. }

该函数的作用是创建一个邻接矩阵有向图。实际上,该方法创建的有向图,就是上面的图G2。它的调用方法如下:

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

2.2 创建图(自己输入)

  1. /*
  2. * 创建图(自己输入数据)
  3. */
  4. MatrixDG::MatrixDG()
  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. }
  40. }

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

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

点击查看:源代码

邻接矩阵有向图(二)之 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. core的生成

    ubuntu12.04,默认无法生成core文件 输入ulimit -c 1024就ok了 列一下ulimit的参数,貌似这个命令是系统性能控制相关的,先不管了. 表 1. ulimit 参数说明 选 ...

  2. LaTex随笔

    最近简单接触了LaTex排版,留下一些笔记供日后参考. 1.基本格式 \documentclass{article}\title{……}\begin{document}\maketitle\secti ...

  3. JavaWeb开发学习(一)-JavaWeb开发概述

    1.Web相关概念 Web程序也就是一般所说的网站,由服务器.客户端浏览器以及网络组成.Web程序的好处是使用简单,不需要安装.学习,有一台电脑.一根网线就可以使用.Web程序不是一般意义上的网站.网 ...

  4. java 内存机制

    1.Java的内存机制 Java 把内存划分成两种:一种是栈内存,另一种是堆内存.在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一个变量时,Java 就在 ...

  5. SQLSERVER中如何快速比较两张表的不一样

    SQLSERVER中如何快速比较两张表的不一样 不知不觉要写2014年的最后一篇博文了~ 一般来说,如何检测两张表的内容是否一致,体现在复制的时候发布端和订阅端的两端的数据上面 我这里罗列了一些如何从 ...

  6. Angularjs路由需要了解的那点事

    Angularjs路由需要了解的那点事 我们知道angularjs是特别适合单页面应用,为了通过单页面完成复杂的业务功能,势必需要能够从一个视图跳转到另外一个视图,也就是需要在单个页面里边加载不同的模 ...

  7. iOS 视图,动画渲染机制探究

    腾讯Bugly特约作者:陈向文 终端的开发,首当其冲的就是视图.动画的渲染,切换等等.用户使用 App 时最直接的体验就是这个界面好不好看,动画炫不炫,滑动流不流畅.UI就是 App 的门面,它的体验 ...

  8. UWP开发随笔——使用SQLite数据库

    摘要 大多数的app都需要数据存储,在数据存储这方面,强大的windows把app数据分为两种:settings和files,并提供了十分简洁的api,让开发者能够轻松使用.但是在有些场景下,app的 ...

  9. RabbitMQ(六)远程连接

    RabbitMQ(六)远程连接 默认情况下,rabbitmq使用`guest`来连接本地(localhost)的server,当需要远程连接时,就会失效. "guest" user ...

  10. Android获取View对应的Bitmap

    我的应用里面有一个需求,将一个画面分享出去,这个画面底层是一个View,所以首先要把这个View转换成Bitmap,然后在分享这个bitmap即可.话不多说,直接上代码. 有个地方需要注意一下:就是/ ...