数据库知识之图的创建以及各种遍历、生成树的形成

news2024/11/19 11:29:21

  1. 利用邻接矩阵创建图并打印输出
  2. 利用递归完成dfs算法遍历
  3. 利用非递归完成bfs算法遍历
  4. 利用prim算法得出最小生成树
  5. 利用kruskal算法得出最小生成树

#include <iostream>

#include <cstdlib>//包含一些特定函数

#include <string>

//邻接矩阵结构存储图

#define what 0

#define maxvertex 10

#define maxedge 40

using namespace std;

typedef enum {DG,DN,UDG,UDN}graphkind;//以枚举存储图的种类

typedef char vertextype;//顶点数据类型

typedef struct arccell

{

int adj;//有权值则为权值

}adjmatrix[maxvertex][maxvertex];//创建一个能存储10个结点的邻接矩阵

typedef struct

{

vertextype vexs[maxvertex];//顶点向量

adjmatrix arcs;//邻接矩阵

int vexnum,arcnum;//图的当前顶点数和弧数

graphkind kind;

}mygraph;

mygraph G;

int visited[maxvertex];//创建一个标记数组

int locatevex(mygraph G,vertextype v1)

{

int i;

for(i=1;i<=G.vexnum;i++)//功能是找出顶点v1

{

if(G.vexs[i]==v1)

return i;

}

return -1;

}

int creatUDN(mygraph &G)

//创造一个无向图带权重

{

vertextype v1,v2;

int w,j,i;

cout<<"输入图的顶点数"<<endl;

cin>>G.vexnum;

cout<<"输入图的边数"<<endl;

cin>>G.arcnum;//记录顶点数和边数

cout<<"输入顶点向量(向量定义最小为1)"<<endl;

for(i=1;i<=G.vexnum;i++)

{

cin>>G.vexs[i];

}

for(i=1;i<=G.vexnum;i++)

for(j=1;j<=G.vexnum;j++)

{

G.arcs[i][j].adj=0;//权值进行初始化

}

for(int k=1;k<=G.arcnum;k++)//边的创建及边的权值的赋值

{

cout<<"输入边依附的两个顶点"<<endl;

cin>>v1>>v2;

cout<<"输入此边的权值"<<endl;

cin>>w;

i=locatevex(G,v1);

j=locatevex(G,v2);

G.arcs[i][j].adj=w;

G.arcs[j][i].adj=G.arcs[i][j].adj;//通过对i,j的位置分别赋值创建一个对称的邻接矩阵

}

return 1;

}

void dismygraph(mygraph G)

{

cout<<"图的邻接矩阵是:"<<endl;

for(int i=1;i<=G.vexnum;i++)

{

for(int j=1;j<=G.vexnum;j++)//用for循环显示邻接矩阵

cout<<"  "<<G.arcs[i][j].adj;

cout<<endl;

}

}

void dfs(int V,int n)//n为顶点数

{

int w;

cout<<G.vexs[V]<<" ";

visited[V]=1;//当遍历过了就标记为1

w=1;

while(w<n && G.arcs[V][w].adj==0)//如果遍历还在顶点数范围内,并且邻接矩阵元素等于0,则跳过此元素继续遍历下去

w++;

while(w<=n)

{

if(visited[w]==0 && G.arcs[V][w].adj!=0)//如果标记数组未标记,并且邻接矩阵元素不等于0,则遍历此元素

dfs(w,n);

w++;

}

}

void bfs(int V,int n)//bfs遍历程序

{

int i,j,visit[10];

for(i=0;i<=n;i++)

visit[i]=0;//标记数组,并且初始化

cout<<G.vexs[1]<<" ";

visit[1]=1;

for(j=1;j<=n;j++)

for(i=1;i<=n;i++)

{

if(visit[i]==0 && G.arcs[j][i].adj!=0)//如果在同一行遇到不为0的就输出

{

visit[i]=1;//如果在下一行遇到同一个数不为0则无视

cout<<G.vexs[i]<<" ";

}

}

cout<<"  "<<endl;

}

void prim(int V,int n)

{

int lowcost[maxvertex][maxvertex],closest[maxvertex],a[maxvertex];

int i,j,k,m,min,b,g,sum;

sum=0;

for(m=1;m<=n;m++)

for(i=1;i<=n;i++)

{

lowcost[m][i]=G.arcs[m][i].adj;//将所有与第一个结点有关的结点的权值都记录下来

// closest[i]=1;//所有都标为未遍历,剩下第一个结点

}

lowcost[1][1]=0;//第一个结点标记为已遍历

k=1;

cout<<"1"<<"  "<<"0"<<endl;

for(i=1;i<n;i++)

{

a[i]=k;

min=maxedge;//将最大的权值赋给min

for(g=1;g<=i;g++)

{

b=a[g];

for(j=2;j<=n;j++)

{

if((lowcost[b][j]<min) && (lowcost[b][j]!=0) && G.vexs[j]!=0)//寻找最小的权值,并且权值不为0

{

min=lowcost[b][j];

k=j;

m=b;

}

}//经过循环后min有最小的权值,k为该结点

}

cout<<k<<"-"<<m<<"  "<<"权值为:"<<" "<<min<<endl;

sum=sum+min;

lowcost[b][k]=0;

G.vexs[k]=0;

}

cout<<"总权值为: "<<sum<<endl;

}

void kruskal(int V,int n)

{

int set[10], i, j,sum=0;//sum记录总权值

int k=1, a=1, b=1, min=maxedge;

for(i=1;i<=n;i++)

G.vexs[i]=i;//初始化顶点

for(i=1; i<=G.vexnum; i++)

set[i]=i;//各个顶点属于各个集合

while(k < G.vexnum)//有n-1条边将n个结点连在一起

{

for(i=1; i<=G.vexnum; i++)//对上半边矩阵进行遍历查找

for(j=i; j<=G.vexnum; j++)

if(G.arcs[i][j].adj<min && G.arcs[i][j].adj!=0)

{

min=G.arcs[i][j].adj;

a=i;

b=j;

}//找到最小的,并且没有被标记过的边记录下来

G.arcs[a][b].adj=0;//将找到的边标记为已读

if(set[a]!=set[b])//如果两个顶点不相同则打印,两个相等则形成了环路(边的两个顶点不属于一个集合)

{

printf("%d-%d  权值为: %d\n",G.vexs[a],G.vexs[b],min);

k++;//边数加1

sum=sum+min;

for(i=1; i<=G.vexnum; i++)

if(set[i]==set[b])//将顶点b所在集合并入顶点a集合

set[i]=set[a];

}

min=maxedge;//将标记当前最小边重置

}

cout<<"总权值为: "<<sum<<endl;

}

int main()

{//函数的调用和一些基本的打印提示语句

string input;

int i,n;

creatUDN(G);

dismygraph(G);

for(i=0;i<maxvertex;i++)//对标记数组进行初始化

visited[i]=0;

cout<<"深度遍历请输入A"<<endl;

cout<<"广度遍历请输入B"<<endl;

cout<<"prim算法生成最小生成树请输入C"<<endl;

cout<<"kruskal算法生成最小生成树请输入D"<<endl;

cout<<"end结束输入/输入错误重载输入"<<endl;

cin>>input;

while(input!="end")

{

if(input=="A")

{

cout<<"dfs遍历结果为:"<<endl;

dfs(1,G.vexnum);

}

if(input=="B")

{

cout<<"bfs遍历结果为:"<<endl;

bfs(1,G.vexnum);

}

if(input=="C")

{

cout<<"prim遍历结果为:"<<endl;

prim(1,G.vexnum);

}

if(input=="D")

{

cout<<"kruskal遍历结果为:"<<endl;

kruskal(1,G.vexnum);

}

cin>>input;

}

return 0;

}

下面为程序运行截图:

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/11129.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

量子计算(六):量子计算软件介绍

文章目录 量子计算软件介绍 一、量子语言 二、量子软件开发包 三、量子云平台 量子计算软件介绍 一、量子语言 由于当前量子计算机的通用体系架构未得到统一&#xff0c;在硬件层面上的技术路线也未最终确定&#xff0c;所以目前还无法确定哪种量子机器指令集相对更科学、…

2010年408大题总结

2010年408大题第41题第42题第43题第44题第45题第46题第47题第41题 这个考的是散列表&#xff08;巧了&#xff0c;我没复习&#xff0c;这就去看&#xff09; 第一个要记住的是装填因子&#xff0c;关键字个数/装填因子 数组长度 第二个是线性探测再散列&#xff0c;表示如果当…

Android App开发之安全加固中反编译、代码混淆、第三方加固以及重签名的讲解及实战(图文解释 简单易懂)

觉得有帮助请点赞关注收藏~~~ 一、反编译 编译是把代码编译为程序&#xff0c;反编译是把程序破解为代码。 下面介绍反编译的完整过程 首先准备反编译的三个工具&#xff0c;分别是apktool&#xff0c;dex2jar&#xff0c;jd-gui 注意下载它们的最新版本 apktool 对APK文件解…

ASEMI整流桥UD6KB100,UD6KB100尺寸,UD6KB100特征

编辑-Z ASEMI整流桥UD6KB100参数&#xff1a; 型号&#xff1a;UD6KB100 最大重复峰值反向电压&#xff08;VRRM&#xff09;&#xff1a;1000V RMS反向电压VR(RMS)&#xff1a;700 平均整流输出电流&#xff08;IO&#xff09;&#xff1a;6A 峰值正向浪涌电流&#xff…

imx6ull内置温度传感器实践1:输出一个采样

前言 先写代码&#xff0c;然后再一个问题&#xff0c;一个问题分析。不是应该先分析问题&#xff0c;再写代码吗&#xff1f;因为笨呗。分析不明白。只有看到现象&#xff0c;才能明白手册上说的是啥意思。 实例1 主要完成以下几个事情 1 创建一个misc驱动 2 在驱动中将寄存…

【HDU No. 1232】 畅通工程

【HDU No. 1232】 畅通工程 杭电OJ 题目地址 【题意】 现有城镇道路统计表&#xff0c;表中列出了每条直接相连的城镇道路。“畅通工程”的目标是使全省任意两个城镇间都可以通过道路连接&#xff08;间接通过路连接也可以&#xff09;。问最少还需要建设多少条道路&#xff…

JUC并发编程第一篇,复习线程基础知识

JUC并发编程第一篇&#xff0c;复习线程基础知识一、为什么多线程极其重要&#xff1f;二、从start一个线程开始认识多线程三、进程、线程和管程四、用户线程和守护线程一、为什么多线程极其重要&#xff1f; 硬件方面&#xff1a;摩尔定律失效 摩尔定律 价格不变时&#xff0…

Java毕业设计基于springboot 美妆化妆品销售购物网站多商家 前后端分离node

美妆化妆品是当前很多女性的必备用品&#xff0c;所以为了能够让更多的女士用上物美价廉的化妆品我们开发了本系统。基于springboot 美妆化妆品销售购物网站本系统以java为核心开发技术&#xff0c;结合springboot VUE框架实现了一个美妆化妆品销售管理系统。美妆化妆品销售管理…

InheritableThreadLocal

补充:关于ThreadLocal,请看这篇文章关于ThreadLocal内存泄漏的问题_小星向上的博客-CSDN博客 引言:最近在查看shiro登录成功后,获取当前登录人的信息时发现了里面使用了InheritableThreadLocal,,但是我好奇,如果我在里面新建了一个线程,那怎么获取登录人的信息呢,结果发现shir…

(经典dp) 骨牌问题 2*n 3*n n*m

文章目录前言题目2*n3*nn*mn < 5 && m < 1e9n*m < 100END前言 用1*2的骨牌铺满一个平面&#xff0c;是非常经典的一系列dp题目 (各大平台几乎都有这类题) 并且随着平面的要求不同&#xff0c;难度也是层层递增 对于n*m若数据量不同&#xff0c;则对应处理的…

2022IDEA的下载、安装、配置与使用

文章目录1.IntelliJ IDEA 介绍1.2 JetBrains 公司介绍1.2 IntelliJ IDEA 介绍1.3 IDEA 的主要功能介绍1.3.1 语言支持上1.3.2 其他支持1.4 IDEA 的主要优势&#xff1a;(相较于 Eclipse 而言)1.5 IDEA 的下载地址1.6 官网提供的详细使用文档2.windows 下安装过程2.1 安装前的准…

CANdelaStudio中的状态跳转图无法查看

诊断协议那些事儿 诊断协议那些事儿专栏系列文章&#xff0c;本文将介绍如何解决CANdelaStudio中的状态跳转图无法查看的问题。 参考文章&#xff1a; CDD文件——CANdelaStudio 10服务-DiagnosticSessionControl States To display a graphical representation of the stat…

安装kafka和相关配置解析

1选择操作系统 kafka是一个java应用程序&#xff0c;可以运行在很多系统上Windows, MacOS, Linux, 等 一般都是Linux 2安装java环境 3安装zk zk存储的是metadata 架构图如下 Kafka已经用稳定的zk的3.4.6版本进行了广泛的测试&#xff0c;它可以从apache.org的http://bit.ly/2sD…

摩尔斯电码笔记

文章目录1. 前言2. 什么是摩尔斯电码&#xff1f;3. 摩尔斯电码是如何发明的&#xff1f;4. 摩尔斯电码还在使用吗&#xff1f;5. 如何快速记住6. 体验7. 形式表达8. 相关电影1. 前言 最近突然想起之前学习过的莫斯密码已经忘记了&#xff0c;发现如果不实践的话&#xff0c;就…

OOM和JVM最详细介绍

什么是OOM&#xff1f; OOM&#xff0c;全称“Out Of Memory”&#xff0c;翻译成中文就是“内存用完了”&#xff0c;来源于java.lang.OutOfMemoryError。看下关于的官方说明&#xff1a; Thrown when the Java Virtual Machine cannot allocate an object because it is out…

windows服务器证书算法升级

由于前段时间&#xff0c;服务器检查出证书算法较弱&#xff0c;服务器算法采用的SHA1&#xff0c;这个算法在当前已经较落后了。 第一步在命令端输入certsrv.msc&#xff08;如果打不开&#xff0c;请看我的另一篇文章&#xff0c;先安装服务器证书&#xff09; 第二步打开证…

[LeetCode周赛复盘] 第 91 场双周赛补20221015

[LeetCode周赛复盘] 第 91 场双周赛补20221015 一、本周周赛总结二、 [Easy] 2465. 不同的平均值数目1. 题目描述2. 思路分析3. 代码实现三、[Medium] 2466. 统计构造好字符串的方案数1. 题目描述2. 思路分析3. 代码实现四、[Medium] 2467. 树上最大得分和路径1. 题目描述2. 思…

2.2、物理层下面的传输媒体

2.2、物理层下面的传输媒体 注意&#xff1a; 传输媒体不属于网络体系结构的任何一层。若非要将它添加到体系结构中&#xff0c;那只能放在物理层之下 传输媒体大致分为 2 类 2.2.1、导引型传输媒体 导引型传输媒体 电磁波被导引沿着固体媒体传播常见的导引型传输媒体有同…

电子元器件解析01——电阻

摘要电阻是最基本的电子元器件之一&#xff0c;了解电阻的各方面特性对正确选用合适的电阻很有帮助。本文总结了关于电阻的各个性能参数&#xff0c;包括电阻的标称值、精度、温度系数、耐压、封装与功率&#xff1b;总结了电阻的分类&#xff0c;有多种分类依据&#xff0c;包…

基于jsp+mysql+ssm的校园OTO超市系统-计算机毕业设计

项目介绍 本网站主要是针对高校学生以超市购物为重点开发的网站。系统从用户上分为三种&#xff1a;卖家、买家和游客。系统从模块分为买家模块和卖家模块&#xff0c;买家模块包括用户注册登录、商品浏览、商品详情、商品加入购物车、购物车中商品删除、购物车商品数量变更、…