数据结构-图的课后习题(2)
题目要求:
对于下面的这个无向网,给出:
1.“深度优先搜索序列”(从V1开始)
2.“广度优先序列”(从V1开始)
3.“用Prim算法求最小生成树”

代码实现:
1.深度优先搜索:
代码部分:
#include<stdio.h>
#include<malloc.h>
#define MAX 100typedef struct ArcNode{int adjvex;int weight;struct ArcNode *nextarc;
}ArcNode;
typedef struct VNode{char vertex[2];ArcNode *firstarc;
}VNode;
typedef VNode AdjList[MAX];
typedef struct ALGraph{AdjList adjlist;int vexnum,arcnum;
}ALGraph;int LocateVerTex(ALGraph *G,char *v)
{int k;for(k=0;k<G->vexnum;k++)if(G->adjlist[k].vertex[0] == v[0] && G->adjlist[k].vertex[1] == v[1])return k;return -1;
}void CreateALGraph(ALGraph *G)
{int i,adj1,adj2;int weight;char v1[2],v2[2];ArcNode *tmp = NULL;printf("请输入顶点个数和边数:\n");scanf("%d %d",&G->vexnum,&G->arcnum);getchar();printf("请输入{%d}个顶点\n",G->vexnum);for(i=0;i<G->vexnum;i++){scanf("%c%c",&G->adjlist[i].vertex[0],&G->adjlist[i].vertex[1]);G->adjlist[i].firstarc = NULL;}getchar();printf("请输入{%d}条边,格式(v1 v2 权值).\n",G->arcnum);for(i=0;i<G->arcnum;i++){scanf("%c%c %c%c %d",&v1[0],&v1[1],&v2[0],&v2[1],&weight);getchar();adj1 = LocateVerTex(G,v1);adj2 = LocateVerTex(G,v2);if(adj1 == -1 || adj2 == -1){printf("失败.\n");i = i - 1;continue;}else{tmp = (ArcNode*)malloc(sizeof(ArcNode));tmp->adjvex = adj2;tmp->weight = weight;tmp->nextarc = G->adjlist[adj1].firstarc;G->adjlist[adj1].firstarc = tmp;tmp = (ArcNode*)malloc(sizeof(ArcNode));tmp->adjvex = adj1;tmp->weight = weight;tmp->nextarc = G->adjlist[adj2].firstarc;G->adjlist[adj2].firstarc = tmp;printf("成功.\n");}}
}void DFS(ALGraph *G,int v,int *visit)
{ int w;ArcNode *tmp = NULL;visit[v] = 1;printf("访问顶点:{%c%c}.\n",G->adjlist[v].vertex[0],G->adjlist[v].vertex[1]);tmp = G->adjlist[v].firstarc;while(tmp){w = tmp->adjvex;if(visit[w] == 0){DFS(G,w,visit);}tmp = tmp->nextarc;}
}void DFSTraverse(ALGraph *G)
{int visit[G->vexnum];int v;for(v=0;v<G->vexnum;v++){visit[v] = 0;}for(v=0;v<G->vexnum;v++){if(visit[v] == 0){DFS(G,v,visit);}}
}int main()
{ALGraph G;CreateALGraph(&G);DFSTraverse(&G);return 0;
}
验证:

2.广度优先搜索:
代码部分:
#include<stdio.h>
#define MAX 100
typedef struct MGraph{char vertex[MAX][2];int arcs[MAX][MAX];int vexnum,arcnum;
}Mgraph;
int LocateVerTex(MGraph *G,char *v)
{int k;for(k=0;k<G->vexnum;k++){if(G->vertex[k][0] == v[0] && G->vertex[k][1] == v[1])return k;}return -1;
}void CreateMGraph(MGraph *G)
{int i,j,adj1,adj2;int weight;char v1[2],v2[2];printf("请输入顶点个数和边数:\n");scanf("%d %d",&G->vexnum,&G->arcnum);getchar();printf("请输入{%d}个顶点\n",G->vexnum);for(i=0;i<G->vexnum;i++){scanf("%c%c",&G->vertex[i][0],&G->vertex[i][1]);}getchar();for(i=0;i<G->vexnum;i++)for(j=0;j<G->vexnum;j++)G->arcs[i][j] = 0;printf("请输入{%d}条边,格式(v1 v2 权值).\n",G->arcnum);for(i=0;i<G->arcnum;i++){scanf("%c%c %c%c %d",&v1[0],&v1[1],&v2[0],&v2[1],&weight);getchar();adj1 = LocateVerTex(G,v1);adj2 = LocateVerTex(G,v2);if(adj1 == -1 || adj2 == -1){printf("失败.\n");i = i - 1;continue;}else{G->arcs[adj1][adj2] = weight;G->arcs[adj2][adj1] = weight;printf("成功.\n");}}
}void BFSTraverse(MGraph *G)
{int Q[G->vexnum+1],visit[G->vexnum];int i,u,w;for(i=0;i<G->vexnum;i++)visit[i] = 0;int front = 0,rear = 0;for(i=0;i<G->vexnum;i++){if(visit[i] == 0){visit[i] = 1;printf("输出顶点:{%c%c}\n",G->vertex[i][0],G->vertex[i][1]);Q[rear] = i;rear = (rear+1) % (G->vexnum+1);while(front != rear){u = Q[front];front = (front+1) % (G->vexnum+1);for(w=0;w<G->vexnum;w++){if(G->arcs[u][w] != 0 && visit[w] == 0){visit[w] = 1;printf("输出顶点:{%c%c}\n",G->vertex[w][0],G->vertex[w][1]);Q[rear] = w;rear = (rear+1) % (G->vexnum+1);}}}}}
}int main()
{MGraph G;CreateMGraph(&G);BFSTraverse(&G);return 0;
}
验证:

3.用Prim算法求得最小生成树:
代码部分:
#include<stdio.h>
#define MAX 100
typedef struct MGraph{char vertex[MAX][2];int arcs[MAX][MAX];int vexnum,arcnum;
}Mgraph;
typedef struct closedge{char vertex[MAX][2];int lowcost[MAX];
}closedge;int LocateVerTex(MGraph *G,char *v)
{int k;for(k=0;k<G->vexnum;k++){if(G->vertex[k][0] == v[0] && G->vertex[k][1] == v[1])return k;}return -1;
}void CreateMGraph(MGraph *G)
{int i,j,adj1,adj2;int weight;char v1[2],v2[2];printf("请输入顶点个数和边数:\n");scanf("%d %d",&G->vexnum,&G->arcnum);getchar();printf("请输入{%d}个顶点\n",G->vexnum);for(i=0;i<G->vexnum;i++){scanf("%c%c",&G->vertex[i][0],&G->vertex[i][1]);}getchar();for(i=0;i<G->vexnum;i++)for(j=0;j<G->vexnum;j++)G->arcs[i][j] = 999;printf("请输入{%d}条边,格式(v1 v2 权值).\n",G->arcnum);for(i=0;i<G->arcnum;i++){scanf("%c%c %c%c %d",&v1[0],&v1[1],&v2[0],&v2[1],&weight);getchar();adj1 = LocateVerTex(G,v1);adj2 = LocateVerTex(G,v2);if(adj1 == -1 || adj2 == -1){printf("失败.\n");i = i - 1;continue;}else{G->arcs[adj1][adj2] = weight;G->arcs[adj2][adj1] = weight;printf("成功.\n");}}
}int MiniMum(MGraph *G,closedge *cd)
{int j,p=1,min=999;for(j=0;j<G->vexnum;j++){if(cd->lowcost[j] != 0 && cd->lowcost[j] < min){min = cd->lowcost[j];p = j;}}return p;
}void MiniSpanTree_PRIM(MGraph *G,char *u)
{closedge cd;int i,j,k;k = LocateVerTex(G,u);for(j=0;j<G->vexnum;j++){if(j != k){cd.vertex[j][0] = u[0];cd.vertex[j][1] = u[1];cd.lowcost[j] = G->arcs[k][j];}}cd.lowcost[k] = 0;printf("最小代价生成树的各条边为:\n");for(i=1;i<G->vexnum;i++){k = MiniMum(G,&cd);printf("输出边%c%c->%c%c,权值为:{%d}\n",cd.vertex[k][0],cd.vertex[k][1],G->vertex[k][0],G->vertex[k][1],cd.lowcost[k]);cd.lowcost[k] = 0;for(j=0;j<G->vexnum;j++){if(G->arcs[k][j] < cd.lowcost[j]){cd.vertex[j][0] = G->vertex[k][0];cd.vertex[j][1] = G->vertex[k][1];cd.lowcost[j] = G->arcs[k][j];}}}
}int main()
{char original_vertex[2]={'V','1'};MGraph G;CreateMGraph(&G);MiniSpanTree_PRIM(&G,original_vertex);return 0;
}
验证:

相关文章:
数据结构-图的课后习题(2)
题目要求: 对于下面的这个无向网,给出: 1.“深度优先搜索序列”(从V1开始) 2.“广度优先序列”(从V1开始) 3.“用Prim算法求最小生成树” 代码实现: 1.深度优先搜索:…...
[Machine Learning] 多任务学习
文章目录 基于参数的MTL模型 (Parameter-based MTL Models)基于特征的MTL模型 (Feature-based MTL Models)基于特征的MTL模型 I:基于特征的MTL模型 II: 基于特征和参数的MTL模型 (Feature- and Parameter-based MTL Models) 多任务学习 (Multi-task Lear…...
【C语言从入门到放弃 6】递归,强制类型转换,可变参数和错误处理详解
C语言是一种功能强大的编程语言,具有许多高级特性,包括强制类型转换,递归,可变参数和错误处理。在本文中,我们将深入了解这些特性,并提供简单的示例来帮助理解。 递归 递归是一种函数调用自身的技术&…...
使用LLama和ChatGPT为多聊天后端构建微服务
微服务架构便于创建边界明确定义的灵活独立服务。这种可扩展的方法使开发人员能够在不影响整个应用程序的情况下单独维护和完善服务。然而,若要充分发挥微服务架构的潜力、特别是针对基于人工智能的聊天应用程序,需要与最新的大语言模型(LLM&…...
CSS3 用户界面、图片、按钮
一、CSS3用户界面: 在CSS3中,增加了一些新的用户界面特性来调整元素尺寸、框尺寸和外边框。CSS3用户界面属性:resize、box-sizing、outline-offset。 1、resize: resize属性指定一个元素是否应该由用户去调整大小。 <style…...
说说对Redux中间件的理解?常用的中间件有哪些?实现原理?
一、是什么 中间件(Middleware)是介于应用系统和系统软件之间的一类软件,它使用系统软件所提供的基础服务(功能),衔接网络上应用系统的各个部分或不同的应用,能够达到资源共享、功能共享的目的…...
【已验证】php配置连接sql server中文乱码(解决方法)更改utf-8格式
解决数据库中的中文数据在页面显示乱码的问题 在连接的$connectionInfo中设置"CharacterSet" > "UTF-8",指定编码方式即可 $connectionInfo array("UID">$uid, "PWD">$pwd, "Database">$database…...
《未来之路:技术探索与梦想的追逐》
创作纪念日 日期:2023年07月05日文章标题:《从零开始-与大语言模型对话学技术-gradio篇(1)》成为创作者第128天 在这个平凡的一天,我撰写了自己的第一篇技术博客,题为《从零开始-与大语言模型对话学技术-…...
vue3 自动导入composition-apiI和组件
1.api的自动导入 常规写法: <script setup>import { ref, reactive, onMounted, computed ,watch } from vue;import { useRouter } from "vue-router";const router useRouter();const person reactive ({name:张三,age…...
LeetCode15-三数之和
本文最精华的就是下面的视频讲解! 🔗:参考的视频讲解 class Solution {public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> ans new ArrayList<>();Arrays.sort(nums);int nnums.length;int i0,j0,k0,sum0;for(…...
安全物理环境(设备和技术注解)
网络安全等级保护相关标准参考《GB/T 22239-2019 网络安全等级保护基本要求》和《GB/T 28448-2019 网络安全等级保护测评要求》 密码应用安全性相关标准参考《GB/T 39786-2021 信息系统密码应用基本要求》和《GM/T 0115-2021 信息系统密码应用测评要求》 1物理位置选择 1.1机房…...
箭头函数 跟匿名函数this的指向问题
var id 10; function foo() {// 创建时 this->windowthis.id 20; // 等价于 window.id 20let c () > {console.log("id1:", this.id); // 创建时父级 创建时 this->window};let d function () {console.log("id2:", this.id); // 执行时本…...
Java Stream:List分组成Map或LinkedHashMap
在Java中,使用Stream API可以轻松地对集合进行操作,包括将List转换为Map或LinkedHashMap。本篇博客将演示如何利用Java Stream实现这两种转换,同时假设List中的元素是User对象。 1. 数据准备 List<User> list new ArrayList<>(…...
vue2+elementui使用MessageBox 弹框$msgbox自定义VNode内容:实现radio
虽说实现下面的效果,用el-dialog很轻松就能搞定。但是这种简单的交互,我更喜欢使用MessageBox。 话不多说,直接上代码~ <el-button type"primary" size"mini" click"handleApply()" >处理申请</el-b…...
OC 实现手指滑动拖动View
RPReplay_Final1699613924 实现手指滑动拖动View 支持手势移动的控件 支持 Masonry frame 布局 使用富文本 也支持自动高度 核心代码 - (void)handlePanGesture:(UIPanGestureRecognizer *)p {CGPoint panPoint [p locationInView:self.view];CGPoint currentViewPoint _dr…...
多级缓存之实现多级缓存
多级缓存的实现离不开Nginx编程,而Nginx编程又离不开OpenResty。 1. OpenResty快速入门 我们希望达到的多级缓存架构如图: 其中: windows上的nginx用来做反向代理服务,将前端的查询商品的ajax请求代理到OpenResty集群 OpenRest…...
React【axios、全局处理、 antd UI库、更改主题、使用css module的情况下修改第三方库的样式、支持sass less】(十三)
文件目录 Proxying in Development http-proxy-middleware fetch_get fetch 是否成功 axios 全局处理 antd UI库 更改主题 使用css module的情况下修改第三方库的样式 支持sass & less Proxying in Development 在开发模式下,如果客户端所在服务器跟后…...
在gitlab中指定自定义 CI/CD 配置文件
文章目录 1. 介绍2. 配置操作3. 配置场景3.1 CI/CD 配置文件在当前项目step1:在当前项目中创建目录,编写流水线文件存放在该目录中step2:在当前项目中配置step3:运行流水线测试 3.2 CI/CD 配置文件位于外部站点上step1:…...
(论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
文献阅读笔记 简介 题目 Learning a Deep Compact Image Representation for Visual Tracking 作者 N Wang, DY Yeung 原文链接 Learning a Deep Compact Image Representation for Visual Tracking (neurips.cc) 关键词 Object tracking、DLT、SDAE 研究问题 track…...
浅谈设计模式
文章目录 一、单例模式 1.饿汉模式 2.懒汉模式 二、工厂模式 三、建造者模式 四、代理模式 设计模式是前辈们对代码开发的总结,是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解…...
AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
