图的简单应用(C/C++实现)
存档:
- #include <stdio.h>
- #include <stdlib.h>
- #define maxv 10//定义最大顶点数
- typedef char elem;//图中顶点的数据类型
- #include "graph.h"
- void main()
- {
- elem v0;
- int v;
- mgraph g;
- printf("1.初始化函数测试:\n");
- initial(g);
- printf("2.创建函数测试:\n");
- create(g);
- printf("3.输出函数测试:\n");
- printg(g);
- printf("4.求最短路径:\n");
- printf("请输出源顶点数据v0:");
- scanf("%c",&v0);
- v=locate(g,v0);
- dijkstra(g,v);
- printf("5.输出最短路径:\n");
- printpath(g,v);
- printf("\n");
- }
- //有向带权网的邻接矩阵,顶点数据为字符型
- #define inf 32767
- typedef struct MGraph
- {
- elem vexes[maxv];//顶点表
- int edges[maxv][maxv];//邻接矩阵
- int n,e;//顶点数n和边数e
- }mgraph;
- void initial(mgraph &g)//初始化函数
- {
- int i,j;
- g.e=;
- g.n=;
- for(j=;j<maxv;j++)//建立顶点表
- g.vexes[j]=;
- for(i=;i<maxv;i++)
- {
- for(j=;j<maxv;j++)
- {
- g.edges[i][j]=inf;//初始化邻接矩阵
- }
- }
- }
- int locate(mgraph g,elem u)//查找顶点对应的数组下标值
- {
- for(int i=;i<g.n;i++)
- {
- if(g.vexes[i]==u)
- return i;
- }
- return -;
- }
- void create(mgraph &g)//创建有向带权网的邻接矩阵存储
- {
- int i,j,k,w;
- elem u,v;
- printf("请输入有向图的顶点数:");
- scanf("%d",&g.n);
- printf("请输入有向图的弧数:");
- scanf("%d",&g.e);
- fflush(stdin);//清空缓存中的数据
- printf("请输入字符型顶点数据,如ABCD:");
- for(j=;j<g.n;j++)
- scanf("%c",&g.vexes[j]);//建立顶点表
- fflush(stdin);
- printf("请输入弧的信息,格式:弧尾,弧头,权值\n");
- for(k=;k<g.e;k++)
- {
- scanf("%c,%c,%d",&u,&v,&w);
- i=locate(g,u);
- j=locate(g,v);
- g.edges[i][j]=w;
- fflush(stdin);
- }
- }
- void printg(mgraph g)//输出有向带权网的邻接矩阵
- {
- int i,j;
- printf("输入图的邻接矩阵存储信息:\n");
- printf("顶点数据:\n");
- for(i=;i<g.n;i++)
- printf("%d: %c\n",i,g.vexes[i]);
- printf("邻接矩阵数据:\n");
- for(i=;i<g.n;i++)
- {
- for(j=;j<g.n;j++)
- {
- if(g.edges[i][j]==inf)
- printf(" ∞");
- else
- printf("%3d",g.edges[i][j]);
- }
- printf("\n");
- }
- }
- int dist[maxv];//dist存当前找到的最短路径长度
- int path[maxv];//当前找到的最短路径最后的一个中转顶点
- bool s[maxv];//标记当前是否已求出最短路径,false表示没求出,true表示已求出
- void dijkstra(mgraph g,int v)//迪杰斯特拉算法从顶点v到其余各顶点的最短路径
- {
- int mindis,i,j,u;
- for(i=;i<g.n;i++)
- {
- dist[i]=g.edges[v][i];//当前最短路径长度初始化
- s[i]=false;//s[]标记还没求出当前路径
- if(g.edges[v][i]<inf)//初始化当前找到的最短路径最后一个中转顶点
- path[i]=v;
- else
- path[i]=-;
- }
- s[v]=true;//源点编号v标记已求出最短路径
- path[v]=;//源点v没有前驱顶点
- for(i=;i<g.n;i++)//循环直到所有顶点的最短路径都求出或没有最短路径
- {
- mindis=inf;
- u=-;//存当前找到的路径最短的新顶点下标
- for(j=;j<g.n;j++)//选取不在s中且具有最小距离的顶点u
- {
- if((s[j]==false)&&(dist[j]<mindis))
- {
- u=j;
- mindis=dist[j];
- }
- }
- if(mindis<inf)//如果找到了新的最短路径
- {
- s[u]=true;//新选出顶点u标记为找到了最短路径
- for(j=;j<g.n;j++)//修改未找到最短路径顶点信息
- {
- if(s[j]==false)
- {
- if(g.edges[u][j]<inf&&dist[u]+g.edges[u][j]<dist[j])
- {
- dist[j]=dist[u]+g.edges[u][j];//修改当前最短路径长度
- path[j]=u;//修改当前最短路径最后一个中转点
- }
- }
- }
- }
- }
- }
- void printpath(mgraph g,int v)//输出最短路径和最短路径长度
- {
- int i,j,w;
- int road[maxv];//为输出最短路径做临时存储
- printf("%c到其他各顶点有没有找到最短路径:\n",g.vexes[v]);
- for(i=;i<g.n;i++)
- {
- if(s[i])
- printf("%d:有 ",i);
- else
- printf("%d:无 ",i);
- }
- printf("\n");
- for(i=;i<maxv;i++)
- road[i]=-;
- for(i=;i<g.n;i++)
- {
- if((s[i]==true)&&(i!=v))//当前顶点有最短路径,并且不是源点
- {
- printf("从%c到%c的最短路径长度为:%d\t路径为:",g.vexes[v],g.vexes[i],dist[i]);
- printf("%c->",g.vexes[v]);
- w=path[i];//最短路径途径的顶点
- j=;//为实现逆转标记途径顶点数
- while(w!=v)//回溯途径顶点
- {
- road[j]=w;
- j++;
- w=path[w];
- }
- for(j--;j>=;j--)//输出最短路径
- {
- printf("%c->",g.vexes[road[j]]);
- road[j]=-;
- }
- printf("%c\n",g.vexes[i]);
- }
- else
- printf("从%c到%c不存在路径\n",g.vexes[v],g.vexes[i]);
- }
- }
运行结果如下:
图的简单应用(C/C++实现)的更多相关文章
- Neo4j属性图模型简单介绍
本文主要是对Neo4j属性图模型简单的介绍. Neo4j是什么? Neo4j是一款是由java语言实现的图数据库,图形数据库将数据以图的数据结构进行存储和管理,并且能够以高度可问的方式优雅地表示任何种 ...
- iOS圆盘转动引导图的简单实现
最近更新的一批app,好多都采用了圆盘转动的效果,比如:百度音乐.当当,大概效果如下: 看看这个是怎么实现的吧. 一.视图元素布局 首先需要明确,这些视图元素是分布在一个圆周上的,通过滑动位置,以圆周 ...
- 免费在线使用Ayoa:让思维导图更简单
在学习和工作中,我们都会遇到需要使用思维导图的情况,导图可以很好地帮助我们处理工作,完成记录和分享,是一个非常便捷的工具.今天小编就想和大家分享一款非常简单好用的思维导图软件,Ayoa. 之所以要将它 ...
- as画柱型图的简单算法(关于柱型图宽和间距问题)
做统计数据,经常用到如下柱型图: 柱图的X轴宽度(W)是已知的,在不影响柱的美观度情况下,怎么确定柱的宽度(w1)和柱间距(p1)的具体数值或比例呢? 在X轴宽度(W)已确定,柱的个数(A)是个不定值 ...
- javascript输出图的简单路径
<script> //图的构建 function vnode() { this.visited=0; this.vertex=0; this.arcs=new Array(); } fun ...
- highcharts折线图的简单使用
第一步:官网下载压缩包https://www.hcharts.cn/download 第二步:HTML中引入highcharts.js <!DOCTYPE html> <html&g ...
- 高仿MT4行情终端(K线图+操控+简单架构)
技术:VS2015 Update3 + QT 5.11.2 + BOOST 1.68 + QT VS Tools + C++11 概述 模仿外汇MT4的界面 详细 代码下载:http://www. ...
- pandas可视化:各种图的简单使用
一.Matplotlib中几种图的名字 折线图:plot 柱形图:bar 直方图:hist 箱线图:box 密度图:kde 面积图:area 散点图:scatter 散点图矩阵:scatter_mat ...
- Spark GraphX图计算简单案例【代码实现,源码分析】
一.简介 参考:https://www.cnblogs.com/yszd/p/10186556.html 二.代码实现 package big.data.analyse.graphx import o ...
随机推荐
- 如何优雅地在React项目中使用Redux
前言 或许你当前的项目还没有到应用Redux的程度,但提前了解一下也没有坏处,本文不会安利大家使用Redux 概念 首先我们会用到哪些框架和工具呢? React UI框架 Redux 状态管理工具,与 ...
- MySQL数据库常见操作
数据库连接与关闭:mysql -h 服务器主机地址 -u 用户名 -p 用户密码 创建新用户并授权:grant 权限 on 数据库.数据表 to 用户名@登录主机 identified by &quo ...
- http中的get和post(二)
博客园精华区有篇文章< GET 和 POST 有什么区别?及为什么网上的多数答案都是错的 >,文中和回复多是对以下两个问题进行了深究: 长度限制 Url 是否隐藏数据 在我看来这两者都不是 ...
- 通过 Sublime Package Control 安装插件后不能用的解决办法
最近使用 Sublime 写 SASS 的时候需要使用高亮功能,通过 Package Control 安装了相关插件,但是安装之后没有反应,再次打开 Package Control 的时候,已经搜索不 ...
- Linux 学习记录 二 (文件的打包压缩).
前言:本文参考<鸟哥的Linux 私房菜>,如有说的不对的地方,还请指正!谢谢! 环境:Centos 6.4 和window不同,在Linux压缩文件需要注意的是,压缩后的文件会 ...
- lumen安装后输出hello world
1.安装composer,具体请百度 2.composer 切换中国镜像,好处自己体会,命令如下 composer config -g repo.packagist composer https:// ...
- canvas学习api
1.canvas.getContext():获取渲染上下文和绘画功能: 一.绘制矩形 2.ctx.fillRect(x,y,width,height):绘制矩形: 3.ctx.strokeRect(x ...
- MVCC的一些理解
link 一.MVCC简介 MVCC (Multiversion Concurrency Control),即多版本并发控制技术,它使得大部分支持行锁的事务引擎,不再单纯的使用行锁来进行数据库的并发控 ...
- linux下后台运行MATLAB
原帖:http://sypeterli1.blog.163.com/blog/static/2283740492013101745824207/ 后台运行matlab脚本文件的方法:nohup ...
- MySQL集群PXC的搭建
MySQL集群PXC的搭建 最近公司某客户要求我们的数据库搭建PXC集群以保证他们的系统高性能和搞稳定性 以后花费了一些时间去搭建和测试,也踩过一些坑,准备分享出来 系统:centos6.6PXC:5 ...