存档:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define maxv 10//定义最大顶点数
  4. typedef char elem;//图中顶点的数据类型
  5. #include "graph.h"
  6. void main()
  7. {
  8. elem v0;
  9. int v;
  10. mgraph g;
  11. printf("1.初始化函数测试:\n");
  12. initial(g);
  13. printf("2.创建函数测试:\n");
  14. create(g);
  15. printf("3.输出函数测试:\n");
  16. printg(g);
  17. printf("4.求最短路径:\n");
  18. printf("请输出源顶点数据v0:");
  19. scanf("%c",&v0);
  20. v=locate(g,v0);
  21. dijkstra(g,v);
  22. printf("5.输出最短路径:\n");
  23. printpath(g,v);
  24. printf("\n");
  25. }
  1. //有向带权网的邻接矩阵,顶点数据为字符型
  2. #define inf 32767
  3. typedef struct MGraph
  4. {
  5. elem vexes[maxv];//顶点表
  6. int edges[maxv][maxv];//邻接矩阵
  7. int n,e;//顶点数n和边数e
  8. }mgraph;
  9. void initial(mgraph &g)//初始化函数
  10. {
  11. int i,j;
  12. g.e=;
  13. g.n=;
  14. for(j=;j<maxv;j++)//建立顶点表
  15. g.vexes[j]=;
  16. for(i=;i<maxv;i++)
  17. {
  18. for(j=;j<maxv;j++)
  19. {
  20. g.edges[i][j]=inf;//初始化邻接矩阵
  21. }
  22. }
  23. }
  24. int locate(mgraph g,elem u)//查找顶点对应的数组下标值
  25. {
  26. for(int i=;i<g.n;i++)
  27. {
  28. if(g.vexes[i]==u)
  29. return i;
  30. }
  31. return -;
  32. }
  33. void create(mgraph &g)//创建有向带权网的邻接矩阵存储
  34. {
  35. int i,j,k,w;
  36. elem u,v;
  37. printf("请输入有向图的顶点数:");
  38. scanf("%d",&g.n);
  39. printf("请输入有向图的弧数:");
  40. scanf("%d",&g.e);
  41. fflush(stdin);//清空缓存中的数据
  42. printf("请输入字符型顶点数据,如ABCD:");
  43. for(j=;j<g.n;j++)
  44. scanf("%c",&g.vexes[j]);//建立顶点表
  45. fflush(stdin);
  46. printf("请输入弧的信息,格式:弧尾,弧头,权值\n");
  47. for(k=;k<g.e;k++)
  48. {
  49. scanf("%c,%c,%d",&u,&v,&w);
  50. i=locate(g,u);
  51. j=locate(g,v);
  52. g.edges[i][j]=w;
  53. fflush(stdin);
  54. }
  55. }
  56. void printg(mgraph g)//输出有向带权网的邻接矩阵
  57. {
  58. int i,j;
  59. printf("输入图的邻接矩阵存储信息:\n");
  60. printf("顶点数据:\n");
  61. for(i=;i<g.n;i++)
  62. printf("%d: %c\n",i,g.vexes[i]);
  63. printf("邻接矩阵数据:\n");
  64. for(i=;i<g.n;i++)
  65. {
  66. for(j=;j<g.n;j++)
  67. {
  68. if(g.edges[i][j]==inf)
  69. printf(" ∞");
  70. else
  71. printf("%3d",g.edges[i][j]);
  72. }
  73. printf("\n");
  74. }
  75. }
  76. int dist[maxv];//dist存当前找到的最短路径长度
  77. int path[maxv];//当前找到的最短路径最后的一个中转顶点
  78. bool s[maxv];//标记当前是否已求出最短路径,false表示没求出,true表示已求出
  79. void dijkstra(mgraph g,int v)//迪杰斯特拉算法从顶点v到其余各顶点的最短路径
  80. {
  81. int mindis,i,j,u;
  82. for(i=;i<g.n;i++)
  83. {
  84. dist[i]=g.edges[v][i];//当前最短路径长度初始化
  85. s[i]=false;//s[]标记还没求出当前路径
  86. if(g.edges[v][i]<inf)//初始化当前找到的最短路径最后一个中转顶点
  87. path[i]=v;
  88. else
  89. path[i]=-;
  90. }
  91. s[v]=true;//源点编号v标记已求出最短路径
  92. path[v]=;//源点v没有前驱顶点
  93. for(i=;i<g.n;i++)//循环直到所有顶点的最短路径都求出或没有最短路径
  94. {
  95. mindis=inf;
  96. u=-;//存当前找到的路径最短的新顶点下标
  97. for(j=;j<g.n;j++)//选取不在s中且具有最小距离的顶点u
  98. {
  99. if((s[j]==false)&&(dist[j]<mindis))
  100. {
  101. u=j;
  102. mindis=dist[j];
  103. }
  104. }
  105. if(mindis<inf)//如果找到了新的最短路径
  106. {
  107. s[u]=true;//新选出顶点u标记为找到了最短路径
  108. for(j=;j<g.n;j++)//修改未找到最短路径顶点信息
  109. {
  110. if(s[j]==false)
  111. {
  112. if(g.edges[u][j]<inf&&dist[u]+g.edges[u][j]<dist[j])
  113. {
  114. dist[j]=dist[u]+g.edges[u][j];//修改当前最短路径长度
  115. path[j]=u;//修改当前最短路径最后一个中转点
  116. }
  117. }
  118. }
  119. }
  120. }
  121. }
  122. void printpath(mgraph g,int v)//输出最短路径和最短路径长度
  123. {
  124. int i,j,w;
  125. int road[maxv];//为输出最短路径做临时存储
  126. printf("%c到其他各顶点有没有找到最短路径:\n",g.vexes[v]);
  127. for(i=;i<g.n;i++)
  128. {
  129. if(s[i])
  130. printf("%d:有 ",i);
  131. else
  132. printf("%d:无 ",i);
  133. }
  134. printf("\n");
  135. for(i=;i<maxv;i++)
  136. road[i]=-;
  137. for(i=;i<g.n;i++)
  138. {
  139. if((s[i]==true)&&(i!=v))//当前顶点有最短路径,并且不是源点
  140. {
  141. printf("从%c到%c的最短路径长度为:%d\t路径为:",g.vexes[v],g.vexes[i],dist[i]);
  142. printf("%c->",g.vexes[v]);
  143. w=path[i];//最短路径途径的顶点
  144. j=;//为实现逆转标记途径顶点数
  145. while(w!=v)//回溯途径顶点
  146. {
  147. road[j]=w;
  148. j++;
  149. w=path[w];
  150. }
  151. for(j--;j>=;j--)//输出最短路径
  152. {
  153. printf("%c->",g.vexes[road[j]]);
  154. road[j]=-;
  155. }
  156. printf("%c\n",g.vexes[i]);
  157. }
  158. else
  159. printf("从%c到%c不存在路径\n",g.vexes[v],g.vexes[i]);
  160. }
  161. }

运行结果如下:

图的简单应用(C/C++实现)的更多相关文章

  1. Neo4j属性图模型简单介绍

    本文主要是对Neo4j属性图模型简单的介绍. Neo4j是什么? Neo4j是一款是由java语言实现的图数据库,图形数据库将数据以图的数据结构进行存储和管理,并且能够以高度可问的方式优雅地表示任何种 ...

  2. iOS圆盘转动引导图的简单实现

    最近更新的一批app,好多都采用了圆盘转动的效果,比如:百度音乐.当当,大概效果如下: 看看这个是怎么实现的吧. 一.视图元素布局 首先需要明确,这些视图元素是分布在一个圆周上的,通过滑动位置,以圆周 ...

  3. 免费在线使用Ayoa:让思维导图更简单

    在学习和工作中,我们都会遇到需要使用思维导图的情况,导图可以很好地帮助我们处理工作,完成记录和分享,是一个非常便捷的工具.今天小编就想和大家分享一款非常简单好用的思维导图软件,Ayoa. 之所以要将它 ...

  4. as画柱型图的简单算法(关于柱型图宽和间距问题)

    做统计数据,经常用到如下柱型图: 柱图的X轴宽度(W)是已知的,在不影响柱的美观度情况下,怎么确定柱的宽度(w1)和柱间距(p1)的具体数值或比例呢? 在X轴宽度(W)已确定,柱的个数(A)是个不定值 ...

  5. javascript输出图的简单路径

    <script> //图的构建 function vnode() { this.visited=0; this.vertex=0; this.arcs=new Array(); } fun ...

  6. highcharts折线图的简单使用

    第一步:官网下载压缩包https://www.hcharts.cn/download 第二步:HTML中引入highcharts.js <!DOCTYPE html> <html&g ...

  7. 高仿MT4行情终端(K线图+操控+简单架构)

    技术:VS2015 Update3 + QT 5.11.2 + BOOST 1.68 + QT VS Tools + C++11   概述 模仿外汇MT4的界面 详细 代码下载:http://www. ...

  8. pandas可视化:各种图的简单使用

    一.Matplotlib中几种图的名字 折线图:plot 柱形图:bar 直方图:hist 箱线图:box 密度图:kde 面积图:area 散点图:scatter 散点图矩阵:scatter_mat ...

  9. Spark GraphX图计算简单案例【代码实现,源码分析】

    一.简介 参考:https://www.cnblogs.com/yszd/p/10186556.html 二.代码实现 package big.data.analyse.graphx import o ...

随机推荐

  1. 如何优雅地在React项目中使用Redux

    前言 或许你当前的项目还没有到应用Redux的程度,但提前了解一下也没有坏处,本文不会安利大家使用Redux 概念 首先我们会用到哪些框架和工具呢? React UI框架 Redux 状态管理工具,与 ...

  2. MySQL数据库常见操作

    数据库连接与关闭:mysql -h 服务器主机地址 -u 用户名 -p 用户密码 创建新用户并授权:grant 权限 on 数据库.数据表 to 用户名@登录主机 identified by &quo ...

  3. http中的get和post(二)

    博客园精华区有篇文章< GET 和 POST 有什么区别?及为什么网上的多数答案都是错的 >,文中和回复多是对以下两个问题进行了深究: 长度限制 Url 是否隐藏数据 在我看来这两者都不是 ...

  4. 通过 Sublime Package Control 安装插件后不能用的解决办法

    最近使用 Sublime 写 SASS 的时候需要使用高亮功能,通过 Package Control 安装了相关插件,但是安装之后没有反应,再次打开 Package Control 的时候,已经搜索不 ...

  5. Linux 学习记录 二 (文件的打包压缩).

     前言:本文参考<鸟哥的Linux 私房菜>,如有说的不对的地方,还请指正!谢谢!  环境:Centos 6.4    和window不同,在Linux压缩文件需要注意的是,压缩后的文件会 ...

  6. lumen安装后输出hello world

    1.安装composer,具体请百度 2.composer 切换中国镜像,好处自己体会,命令如下 composer config -g repo.packagist composer https:// ...

  7. canvas学习api

    1.canvas.getContext():获取渲染上下文和绘画功能: 一.绘制矩形 2.ctx.fillRect(x,y,width,height):绘制矩形: 3.ctx.strokeRect(x ...

  8. MVCC的一些理解

    link 一.MVCC简介 MVCC (Multiversion Concurrency Control),即多版本并发控制技术,它使得大部分支持行锁的事务引擎,不再单纯的使用行锁来进行数据库的并发控 ...

  9. linux下后台运行MATLAB

    原帖:http://sypeterli1.blog.163.com/blog/static/2283740492013101745824207/ 后台运行matlab脚本文件的方法:nohup     ...

  10. MySQL集群PXC的搭建

    MySQL集群PXC的搭建 最近公司某客户要求我们的数据库搭建PXC集群以保证他们的系统高性能和搞稳定性 以后花费了一些时间去搭建和测试,也踩过一些坑,准备分享出来 系统:centos6.6PXC:5 ...