图的简单应用(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 ...
随机推荐
- 小白的Python之路 PEP8 代码风格
转载自http://www.douban.com/note/134971609/ Python 的代码风格由 PEP 8 描述.这个文档描述了 Python 编程风格的方方面面.在遵守这个文档的条件下 ...
- ES6之遍历器(Iterator)
什么是Iterator?他是一种接口,为各种不同的数据结构提供统一的访问机制,任何数据结构只要部署上Iterator接口就可以完成遍历操作(PS:个人认为他的这个遍历就是c语言里面的指针),他的作用有 ...
- iOS 应用中加载文档pdf/word/txt
一.加载PDF文档:应用内打开文档.手机中其他应用打开文档 Demo 首先拖入一个文档pdf.word.txt,打开不同的文档知识 文件名字.类型修改即可 #import "ReadView ...
- 模板引擎(smarty)知识点总结
首先我们必须知道使用smarty的流程 1.引入 2.实例化 3.配置 模板目录 编译目录 3.0版本 支持不存在的目录则新建 4.赋值 5.编译显示 某个模板文件(暗示需要哪 ...
- php-fpm开机启动
php-fpm开机自动启动脚本 网上有各种版本的php-fpm开机自动启动脚本, 其实你编译后源目录已经生成自动脚本.不用做任何修改即用. cp {php-5.3.x-source-dir}/sapi ...
- vue移动端弹框组件,vue-layer-mobile
最近做一个移动端项目,弹框写的比较麻烦,查找资料,找到了这个组件,但是说明文档比较少,自己研究了下,把我碰到的错,和详细用法分享给大家!有疑问可以打开组件看一看,这个组件是仿layer-mobile的 ...
- input选择框样式修改与自定义
html自带的选择框样式不好看,并且在ios设备上丑的罚款.所以一般都是自定义样式: 原理:将原来默认的input选择框隐藏,然后控制label的:before与:after,配合矢量图标或者图片来实 ...
- centos 系统日志
Linux系统日志主要有三类:连接时间日志.进程统计日志和错误日志 连接时间日志 连接时间日志由多个程序执行,把记录写入到/var/og/wtmp和/var/run/utmp.ogin等程序更新wtm ...
- sql sever[基本] ''增删改'' 随笔
结构语言分类 DDL(数据定义语言) create drop alter 创建删除以及修改数据库,表,存储过程,触发器,索引.... DML(数据操作语言) insert delete ...
- Office 365也是.NET Core应用开发新战场
最近有幸阅读了陈希章花了一年时间为国内开发者贡献的<Office 365 开发入门指南>. 虽然早期接触过SharePoint的开发,2007年之后就再也没有接触SharePoint的开发 ...