本章介绍邻接矩阵有向图。在"图的理论基础"中已经对图进行了理论介绍,这里就不再对图的概念进行重复说明了。和以往一样,本文会先给出C语言的实现;后续再分别给出C++和Java版本的实现。实现的语言虽不同,但是原理如出一辙,选择其中之一进行了解即可。若文章有错误或不足的地方,请不吝指出!

目录
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. // 邻接矩阵
  2. typedef struct _graph
  3. {
  4. char vexs[MAX]; // 顶点集合
  5. int vexnum; // 顶点数
  6. int edgnum; // 边数
  7. int matrix[MAX][MAX]; // 邻接矩阵
  8. }Graph, *PGraph;

Graph是邻接矩阵对应的结构体。

vexs用于保存顶点,vexnum是顶点数,edgnum是边数;matrix则是用于保存矩阵信息的二维数组。例如,matrix[i][j]=1,则表示"顶点i(即vexs[i])"和"顶点j(即vexs[j])"是邻接点;matrix[i][j]=0,则表示它们不是邻接点。

2. 创建矩阵

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

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

  1. /*
  2. * 创建图(用已提供的矩阵)
  3. */
  4. Graph* create_example_graph()
  5. {
  6. char vexs[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};
  7. char edges[][2] = {
  8. {'A', 'B'},
  9. {'B', 'C'},
  10. {'B', 'E'},
  11. {'B', 'F'},
  12. {'C', 'E'},
  13. {'D', 'C'},
  14. {'E', 'B'},
  15. {'E', 'D'},
  16. {'F', 'G'}};
  17. int vlen = LENGTH(vexs);
  18. int elen = LENGTH(edges);
  19. int i, p1, p2;
  20. Graph* pG;
  21. // 输入"顶点数"和"边数"
  22. if ((pG=(Graph*)malloc(sizeof(Graph))) == NULL )
  23. return NULL;
  24. memset(pG, 0, sizeof(Graph));
  25. // 初始化"顶点数"和"边数"
  26. pG->vexnum = vlen;
  27. pG->edgnum = elen;
  28. // 初始化"顶点"
  29. for (i = 0; i < pG->vexnum; i++)
  30. {
  31. pG->vexs[i] = vexs[i];
  32. }
  33. // 初始化"边"
  34. for (i = 0; i < pG->edgnum; i++)
  35. {
  36. // 读取边的起始顶点和结束顶点
  37. p1 = get_position(*pG, edges[i][0]);
  38. p2 = get_position(*pG, edges[i][1]);
  39. pG->matrix[p1][p2] = 1;
  40. }
  41. return pG;
  42. }

createexamplegraph()是的作用是创建一个邻接矩阵有向图。实际上,该方法创建的有向图,就是上面的图G2。

2.2 创建图(自己输入)

  1. /*
  2. * 创建图(自己输入)
  3. */
  4. Graph* create_graph()
  5. {
  6. char c1, c2;
  7. int v, e;
  8. int i, p1, p2;
  9. Graph* pG;
  10. // 输入"顶点数"和"边数"
  11. printf("input vertex number: ");
  12. scanf("%d", &v);
  13. printf("input edge number: ");
  14. scanf("%d", &e);
  15. if ( v < 1 || e < 1 || (e > (v * (v-1))))
  16. {
  17. printf("input error: invalid parameters!\n");
  18. return NULL;
  19. }
  20. if ((pG=(Graph*)malloc(sizeof(Graph))) == NULL )
  21. return NULL;
  22. memset(pG, 0, sizeof(Graph));
  23. // 初始化"顶点数"和"边数"
  24. pG->vexnum = v;
  25. pG->edgnum = e;
  26. // 初始化"顶点"
  27. for (i = 0; i < pG->vexnum; i++)
  28. {
  29. printf("vertex(%d): ", i);
  30. pG->vexs[i] = read_char();
  31. }
  32. // 初始化"边"
  33. for (i = 0; i < pG->edgnum; i++)
  34. {
  35. // 读取边的起始顶点和结束顶点
  36. printf("edge(%d):", i);
  37. c1 = read_char();
  38. c2 = read_char();
  39. p1 = get_position(*pG, c1);
  40. p2 = get_position(*pG, c2);
  41. if (p1==-1 || p2==-1)
  42. {
  43. printf("input error: invalid edge!\n");
  44. free(pG);
  45. return NULL;
  46. }
  47. pG->matrix[p1][p2] = 1;
  48. }
  49. return pG;
  50. }

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

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

点击查看:源代码

邻接矩阵有向图(一)之 C语言详解的更多相关文章

  1. 邻接表有向图(一)之 C语言详解

    本章介绍邻接表有向图.在"图的理论基础"中已经对图进行了理论介绍,这里就不再对图的概念进行重复说明了.和以往一样,本文会先给出C语言的实现:后续再分别给出C++和Java版本的实现 ...

  2. 邻接矩阵无向图(一)之 C语言详解

    本章介绍邻接矩阵无向图.在"图的理论基础"中已经对图进行了理论介绍,这里就不再对图的概念进行重复说明了.和以往一样,本文会先给出C语言的实现:后续再分别给出C++和Java版本的实 ...

  3. 原来Github上的README.md文件这么有意思——Markdown语言详解(sublime text2 版本)

    一直想学习 Markdown 语言,想起以前读的一篇 赵凯强 的 博客 <原来Github上的README.md文件这么有意思——Markdown语言详解>,该篇博主 使用的是Mac系统, ...

  4. Java Web----EL(表达式语言)详解

     Java Web中的EL(表达式语言)详解 表达式语言(Expression Language)简称EL,它是JSP2.0中引入的一个新内容.通过EL可以简化在JSP开发中对对象的引用,从而规范页面 ...

  5. Floyd算法(一)之 C语言详解

    本章介绍弗洛伊德算法.和以往一样,本文会先对弗洛伊德算法的理论论知识进行介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现. 目录 1. 弗洛伊德算法介绍 2. 弗洛伊德算法图解 3 ...

  6. Dijkstra算法(一)之 C语言详解

    本章介绍迪杰斯特拉算法.和以往一样,本文会先对迪杰斯特拉算法的理论论知识进行介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现. 目录 1. 迪杰斯特拉算法介绍 2. 迪杰斯特拉算法 ...

  7. Prim算法(一)之 C语言详解

    本章介绍普里姆算法.和以往一样,本文会先对普里姆算法的理论论知识进行介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现. 目录 1. 普里姆算法介绍 2. 普里姆算法图解 3. 普里 ...

  8. Kruskal算法(一)之 C语言详解

    本章介绍克鲁斯卡尔算法.和以往一样,本文会先对克鲁斯卡尔算法的理论论知识进行介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现. 目录 1. 最小生成树 2. 克鲁斯卡尔算法介绍 3 ...

  9. 拓扑排序(一)之 C语言详解

    本章介绍图的拓扑排序.和以往一样,本文会先对拓扑排序的理论知识进行介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现. 目录 1. 拓扑排序介绍 2. 拓扑排序的算法图解 3. 拓扑 ...

随机推荐

  1. MyEclipse10优化

    Myeclipse10 优化设置 一.myeclipse字体设置 Window->Preferences->General->Appearance->Colors and Fo ...

  2. XAF Spreadsheet property Editor

    https://www.devexpress.com/Support/Center/Question/Details/T371232

  3. 连接MySQL数据库(android、php、MySQL)

    管理MySQL数据库最简单和最便利的方式是PHP脚本.运行PHP脚本使用HTTP协议和android系统连接.我们以JSON格式编码数据,因为Android和PHP都有现成的处理JSON函数. 下面示 ...

  4. Hadoop2.20集群搭建

    hadoop2.0已经发布了稳定版本了,增加了很多特性,比如HDFS HA.YARN等. 注意:apache提供的hadoop-2.2.0的安装包是在32位操作系统编译的,因为hadoop依赖一些C+ ...

  5. 归并求逆序数(逆序对数) && 线段树求逆序数

    Brainman Time Limit: 1000 MS Memory Limit: 30000 KB 64-bit integer IO format: %I64d , %I64u   Java c ...

  6. Unity粒子系统特性

    经代码测试分析,unity粒子系统 Shiruken粒子系统的可编程性比较差.所有的Modules都无法通过代码控制. 可以用ParticleSystem.SetParticles设置粒子,但是设置进 ...

  7. sql 优化 链接提示 查询提示 标提示

    SQL Server的查询优化器在select查询执行的时候产生一个高效的查询执行计划.如果优化器不能选择最优的计划,那么就需要检查查询计划.统计信息.支持的索引等,而通过使用提示可以改变优化器选择查 ...

  8. 如何利用Github+Appveyor+Nuget打造自己的.net core开源库

    以下教程基于你有一个托管在Github上的.net core项目,如果没有的可以自己fork一个或者自己创建了默认的项目即可. 我们打开需要生成nuget包的项目中的project.json文件,有关 ...

  9. 004. Asp.Net Routing与MVC 之二: 请求如何激活Controller和Action

    上篇讲到 请求到达 MvcRouteHandler ,并且透过 IRouteHandler.GetHttpHandler 获取到了真正的处理程序 MvcHandler 这次我们看看,MvcHandle ...

  10. 作业三:PSP耗时

    请同学们参照教材<构建之法>2.3节表2-4 PSP2.1汇报自己在完成四则运算编程时候的时间分布,发布到博客上. 个人项目耗时情况分析 PSP Personal Software Pro ...