图的简单应用(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 ...
随机推荐
- 【java】反射简单示例
package 反射; public class Test反射 { public static void main(String[] args) { System.out.println(Runtim ...
- 【MySQL】查看支持的字符集show character set;
- Spring Error : No unique bean of type [org.apache.ibatis.session.SqlSessionFactory] is defined
报错信息: Injection of autowired dependencies failed; nested exception is org.springframework.beans.fa ...
- jquery提供的插件无法删除cookie的解决办法
之前使用jquery的cookie插件提供的 $.cookie("key",null)方法删除cookie,结果发现代码中的cookie一直无法删除,导致后面的种种问题. 经过各种 ...
- [编织消息框架][JAVA核心技术]动态代理应用11-水平扩展实现
由于示例,远程服务地址配置在properties文件,通过QMConfig类加载,最优方式是上节介绍过,放在共享内存上,只需要维护一份数据即可,如放在redis上 /** 服务地址<servic ...
- 不解释,分享这个base.css
@charset "utf-8"; /*! * @名称:base.css * @功能:1.重设浏览器默认样式 * 2.设置通用原子类 */ /* 防止用户自定义背景颜色对网页的影响 ...
- 微信小程序生成带参数的二维码 小程序二维码
我是用php写的 先按照要求生成accesstoken $tokenUrl="https://api.weixin.qq.com/cgi-bin/token?grant_type=clien ...
- 分布式文件系统FastDFS详解
上一篇文章<一次FastDFS并发问题的排查经历>介绍了一次生产排查并发问题的经历,可能有些人对FastDFS不是特别的了解,因此计划写几篇文章完整的介绍一下这个软件. 为什么要使用分布式 ...
- 析构函数(C#)
析构函数又称终结器,用于析构类的实例. 定义 析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数.析构函数往往用来做&quo ...
- 轻量级弹出框 lightbox
1. 引入 lightbox.css 和 lightbox.js 2.检查 CSS 并确定调用的 prev.gif 和 next.gif 文件在正确的位置. 同样要确定调用的 loading.gif ...