存档:

 #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++实现)的更多相关文章

  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. 《TCP-IP详解卷1:协议》【PDF】下载

    <TCP-IP详解卷1:协议>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062539 内容简介<TCP/IP详解卷1:协 ...

  2. 小白的Python之路 day1 表达式if ... else ,while循环,for循环

    表达式if ... else 一.用户登陆验证 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 # 提示输入用户名和密码    # 验 ...

  3. adb devices找不到设备解决办法

    问题现象: 解决办法: 1.在设备管理器Android Device中找到设备硬件Id USB\VID对应值: 3.找到.android目录,找到adb_usb.ini文件,如果没有此文件则新建一个, ...

  4. iOS tableView 数据处理,数据分类相同数据整合、合并计算总数总价

    // 数据下载得到数组数据 modelArray = [MZPriceModel mj_objectArrayWithKeyValuesArray:data[@"info"]]; ...

  5. UITableView的性能优化

    UITableView作为ios中使用最频繁的控件之一,其性能优化也是常常要面对的,尤其是当数据量偏大并且设备性能不足时.本文旨在总结tableview的几个性能优化tips,并且随着认识的深入,本文 ...

  6. cocoapods管理以及常遇到的问题

    CocoaPods使用 安装成功啦,咱们来创建Podfile文件 //咱们先滚去项目的根目录,如果不会,你就先滚去看看shell命令教程吧 $ cd /Users/JamesGu/Desktop/Co ...

  7. 学习rollup.js模块文件打包

    学习rollup.js模块文件打包 一:rollup 是什么?Rollup 是一个 JavaScript 模块打包器,可以将小块代码编译成大块复杂的代码. webpack 和 Rollup 对比不同点 ...

  8. /sbin/nologin 和 /bin/false 的区别

    /bin/false是最严格的禁止login选项,一切服务都不能用,而/sbin/nologin只是不允许系统login,可以使用其他ftp等服务 如果想要用false在禁止login的同时允许ftp ...

  9. 来一轮带注释的demo,彻底搞懂javascript中的replace函数

    javascript这门语言一直就像一位带着面纱的美女,总是看不清,摸不透,一直专注服务器端,也从来没有特别重视过,直到最近几年,javascript越来越重要,越来越通用.最近和前端走的比较近,借此 ...

  10. Discuz uc.key泄露导致代码注入漏洞

    漏洞描述:在Discuz中,uc_key是UC客户端与服务端通信的通信密钥,discuz中的/api/uc.php存在代码写入漏洞,导致黑客可写入恶意代码获取uckey,最终进入网站后台,造成数据泄漏 ...