图的简单应用(C/C++实现)

存档:

 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=0;
 13     g.n=0;
 14     for(j=0;j<maxv;j++)//建立顶点表
 15         g.vexes[j]=0;
 16     for(i=0;i<maxv;i++)
 17     {
 18         for(j=0;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=0;i<g.n;i++)
 27     {
 28         if(g.vexes[i]==u)
 29             return i;
 30     }
 31     return -1;
 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=0;j<g.n;j++)
 44         scanf("%c",&g.vexes[j]);//建立顶点表
 45     fflush(stdin);
 46     printf("请输入弧的信息,格式:弧尾,弧头,权值\n");
 47     for(k=0;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=0;i<g.n;i++)
 62         printf("%d: %c\n",i,g.vexes[i]);
 63     printf("邻接矩阵数据:\n");
 64     for(i=0;i<g.n;i++)
 65     {
 66         for(j=0;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=0;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]=-1;
 90     }
 91     s[v]=true;//源点编号v标记已求出最短路径
 92     path[v]=0;//源点v没有前驱顶点
 93     for(i=0;i<g.n;i++)//循环直到所有顶点的最短路径都求出或没有最短路径
 94     {
 95         mindis=inf;
 96         u=-1;//存当前找到的路径最短的新顶点下标
 97         for(j=0;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=0;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=0;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=0;i<maxv;i++)
136         road[i]=-1;
137     for(i=0;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=0;//为实现逆转标记途径顶点数
145             while(w!=v)//回溯途径顶点
146             {
147                 road[j]=w;
148                 j++;
149                 w=path[w];
150             }
151             for(j--;j>=0;j--)//输出最短路径
152             {
153                 printf("%c->",g.vexes[road[j]]);
154                 road[j]=-1;
155             }
156             printf("%c\n",g.vexes[i]);
157         }
158         else
159             printf("从%c到%c不存在路径\n",g.vexes[v],g.vexes[i]);
160     }
161 }

运行结果如下:

时间: 2024-11-09 00:04:55

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

PS扣图的简单整理

一.魔术棒法——最直观的方法 适用范围:图像和背景色色差明显,背景色单一,图像边界清晰. 方法意图:通过删除背景色来获取图像. 方法缺陷:对散乱的毛发没有用. 使用方法:1.点击“魔术棒”工具: 2.在“魔术棒”工具条中,在“连续”项前打勾: 3.“容差”值填入“20”.(值可以看之后的效果好坏进行调节): 4.用魔术棒点背景色,会出现虚框围住背景色: 5.如果对虚框的范围不满意,可以先按CTRL+D取消虚框,再对上一步的“容差”值进行调节: 6.如果对虚框范围满意,按键盘上的DELE键,删除背

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

最近更新的一批app,好多都采用了圆盘转动的效果,比如:百度音乐.当当,大概效果如下: 看看这个是怎么实现的吧. 一.视图元素布局 首先需要明确,这些视图元素是分布在一个圆周上的,通过滑动位置,以圆周中心旋转相应角度,那么该怎么布局呢? 如果把白色圆盘和小人视图分开,就需要代码控制,倾斜角度,然后add到父视图上,倾斜好办,就是图像的旋转,但是,倾斜后的图片的frame就不好控制了. 这时应该想到什么呢?没错,设计妹妹,我订好角度,让设计妹妹把圆盘和小人图一起切图给我,如下: 这样就不用自己去调

图算法系列-图的简单实现

最近看了很多介绍图算法的文章,发现网上可以搜到的资料比较少,所以打算在这写一个介绍图算法的系列文章,一方面是帮助自己整理,另一方面也给大家分享下这方面的知识. 1.1图的定义: 图(graph)由顶点(vertex)和边(edge)的集合组成,每一条边就是一个点对(v,w). 图的种类:地图,电路图,调度图,事物,网络,程序结构 图的属性:有V个顶点的图最多有V*(V-1)/2条边 1.2图的ADT: 1 struct Edge{ 2 int v,w; 3 Edge(int a=-1,int b

JFreeChart线形图的简单应用

JFreeChart的servlet配置就不赘述了! 新建生成线形图的类: package com.loger.chart.line; import java.awt.Font; import javax.servlet.http.HttpSession; import org.jfree.chart.ChartFactory; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.DateAxis; import org.

highcharts折线图的简单使用

第一步:官网下载压缩包https://www.hcharts.cn/download 第二步:HTML中引入highcharts.js <!DOCTYPE html> <html><head lang="en"> <meta charset="UTF-8"> <title></title> <script src="/highcharts/highcharts.js"&

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

技术:VS2015 Update3 + QT 5.11.2 + BOOST 1.68 + QT VS Tools + C++11 概述 模仿外汇MT4的界面 详细 代码下载:http://www.demodashi.com/demo/14949.html 本Demo讲述的范畴: K线的展示(小键盘方向操作,鼠标操作),QT的使用,客户端大致的框架展示. 开发环境: win10 64 位+VS2015 Update3 + QT 5.11.2 + BOOST 1.68 + QT VS Tools +

python 基础学习之 python怎么制作第一个直方图 散点图 折线图 非常简单 利用python画图 python利用numpy画图 我用python制作第一个直方图 散点图 折线图

思路 首先声明 :非常简单  最简单的入门就是 直接拷贝几行代码看看效果 运行玩玩 注意: 本文采用窗口弹出运行显示的方式   可能需要网页显示图表 并且实时生成可能需要另找办法  暂时不处理. 安装numpy python文件导入numpy 复制几行代码 保存即可 在目录下 直接点击运行python文件  就会弹出一个类似cmd的小黑窗  另外再弹出一个绘制出来的图表 完成 关闭的时候 关闭图片  小黑窗自动回关闭. 部分效果图如下 代码参考 Python干货:分享Python绘制六种可视化图

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

一.Matplotlib中几种图的名字 折线图:plot 柱形图:bar 直方图:hist 箱线图:box 密度图:kde 面积图:area 散点图:scatter 散点图矩阵:scatter_matrix 饼图:pie 二.折线图:plot 平均值需要先排序后出出图 df.avg.value_counts().sort_index().plot() 三.柱形图:bar 可先做数据透视,然后生成柱形图 df.pivot_table(index='city',columns='education'

类似轮播图的简单jQuery代码

代码和个人解析: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible&