数据结构-图的课后习题(2)

news2024/12/26 0:19:20

题目要求:

对于下面的这个无向网,给出:

1.“深度优先搜索序列”(从V1开始)

2.“广度优先序列”(从V1开始)

3.“用Prim算法求最小生成树”

代码实现:

1.深度优先搜索:

代码部分:

#include<stdio.h>
#include<malloc.h>
#define MAX 100

typedef 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;
}

验证:

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

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

相关文章

一分钟秒懂人工智能对齐 ( 文末送书 )

人工智能对齐 什么是人工智能对齐为什么要研究人工智能对齐人工智能对齐的常见方法延伸阅读写在末尾&#xff1a; 主页传送门&#xff1a;&#x1f4c0; 传送 什么是人工智能对齐 人工智能对齐&#xff08;AI Alignment&#xff09;指让人工智能的行为符合人的意图和价值观。 …

方太集团合同档案管理平台,让数字化成果深度利用、可查可验

数字经济大背景下&#xff0c;方太集团积极拥抱企业数字化转型&#xff0c;推动合同档案业务管理数字化&#xff0c;助力业务档案高效融合&#xff0c;助力企业创新科技发展。 方太集团&#xff08;以下简称“方太”&#xff09;创建于1996年。作为一家以智能厨电为核心业务的…

[LeetCode]-225. 用队列实现栈

目录 225. 用队列实现栈 题目 ​思路 代码 225. 用队列实现栈 225. 用队列实现栈 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/implement-stack-using-queues/description/ 题目 请你仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff0…

【师兄啊师兄2】大爆料,敖乙回归,创造新里程碑,有望做成年番

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析国漫资讯。 深度爆料《师兄啊师兄》最新资讯消息&#xff0c;玄机公司&#xff0c;作为动漫制作界的佼佼者&#xff0c;其制作的动漫作品一直以来备受瞩目。如今&#xff0c;在斗罗大陆第二部和吞噬星空第四季的热播之下…

node插件MongoDB(四)—— 库mongoose 的个性话读取(字段筛选、数据排序、数据截取)(四)

文章目录 一、字段筛选二、数据排序三、数据截取1. skip 跳过2. limit 限定![在这里插入图片描述](https://img-blog.csdnimg.cn/c7067b1984ee4c6686f8bbe07cae9176.png) 一、字段筛选 字段筛选&#xff1a;只读取指定的数据&#xff0c;比如集合&#xff08;表&#xff09;中有…

github遇到想要强制拉取远程仓库内容

进行项目的时候&#xff0c;遇到了我的远程仓库 Sync fork 更新以后&#xff0c;这时候我的本地就和远程不同步&#xff0c;如果使用 git pull 的时候&#xff0c;如果出现 conficts 过多的情况怎么办&#xff0c;如果我们想要直接把远程仓库拉下来应该怎么办&#xff1f; git…

dRep-基因组质控、去冗余及物种界定

文章目录 Install依赖关系 常用命令常见问题pplacer线程超过30报错当比较基因组很多&#xff08;>4096&#xff09;有了Bdv.csv文件后无需输入基因组list 超多基因组为什么需要界定种&#xff1f;dRep重要概念次级ANI的选择Minimum alignment coverage3. 选择有代表性的基因…

网络原理---拿捏HTTPS协议

文章目录 什么是HTTPS&#xff1f;HTTPS加密方式对称加密非对称加密引入证书 HTTP VS HTTPS 什么是HTTPS&#xff1f; HTTPS也是一个协议&#xff0c;是在HTTP协议的基础上加了一个“加密层”。 HTTP协议的内容都是按照文本的方式明文传输的&#xff0c;这就导致数据在传输过…

Android---App 崩溃

崩溃问题是衡量 App 质量的决定性考核标准。Android 系统会输出各种相应的 log 日志&#xff0c;很大程度上降低了工程师 debug 崩溃问题的难度。如果要给 crash 日志进行分类&#xff0c;可以分为2大类&#xff1a;JVM 异常&#xff08;Exception&#xff09;堆栈信息和 nativ…

爆肝一文,走进大名鼎鼎的HTTP协议(通俗白话+三万字超详细+抓包工具使用)

文章目录 前言1. HTTP 是什么1.1 HTTP 完整请求流程1.2 理解 HTTP 协议的工作过程 2. HTTP 协议格式2.1 抓包工具的使用2.2 抓包工具的原理2.3 抓包结果2.4 协议格式总结 3. HTTP 请求(Request)3.1 认识 URL(Uniform Resource Locator)URL 基本格式关于 URL encode 3.2 认识请求…

2023.11.10联赛 T4题解

题目大意 题目思路 我们考虑分块处理。 我们可以维护一个状态&#xff0c;表示块内每个字母对应的真实字母&#xff0c;因为只有 3 3 3个字母&#xff0c;所以只有 6 6 6种情况。 对于每一个块&#xff0c;我们可以对于每种状态、每种块&#xff0c;预处理出以 A A A或 B B …

商城免费搭建之java商城 java电子商务Spring Cloud+Spring Boot+mybatis+MQ+VR全景+b2b2c

1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前端框架…

19. 深度学习 - 用函数解决问题

文章目录 Hi&#xff0c; 你好。我是茶桁。 上一节课&#xff0c;我们从一个波士顿房价的预测开始写代码&#xff0c;写到了KNN。 之前咱们机器学习课程中有讲到KNN这个算法&#xff0c;分析过其优点和缺点&#xff0c;说起来&#xff0c;KNN这种方法比较低效&#xff0c;在数…

【前端】TypeScript核心知识点讲解

1.TypeScript简介及入门案例 &#xff08;1&#xff09;什么是TypeScript&#xff1f; TypeScript 是 JavaScript 的一个超集&#xff0c;支持 ECMAScript 6 &#xff08;ES6&#xff09;标准。 TypeScript 由微软开发的自由和开源的编程语言。 TypeScript 设计目标是开发大…

ubuntu 16.04.5 安装 vivado 2019.1 完整编译AD9361的环境

一、前期安装 1、安装ncurses库&#xff08;已经包含了&#xff0c;其他的os需要安装&#xff09; sudo apt install libncurses5二、安装 sudo ./xsetup使用lic进行激活。 三、安装后 输入指令 sudo gedit ~/.bashrc 末尾添加 source /opt/Xilinx/Vivado/2019.1/setti…

串口通信(11)-CRC校验介绍算法

本文为博主 日月同辉&#xff0c;与我共生&#xff0c;csdn原创首发。希望看完后能对你有所帮助&#xff0c;不足之处请指正&#xff01;一起交流学习&#xff0c;共同进步&#xff01; > 发布人&#xff1a;日月同辉,与我共生_单片机-CSDN博客 > 欢迎你为独创博主日月同…

条件渲染-if/hidden

1.条件渲染的方法 1.1 wx&#xff1a;if方法&#xff08;少用&#xff09; block只是一个容器&#xff0c;容器内的都用于if判断 1.2 hidden方法 注&#xff1a;view要小写&#xff0c;否则不生效 1.3方法对比

【狂神说Java】Dubbo + Zookeeper

✅作者简介&#xff1a;CSDN内容合伙人、信息安全专业在校大学生&#x1f3c6; &#x1f525;系列专栏 &#xff1a;狂神说Java &#x1f4c3;新人博主 &#xff1a;欢迎点赞收藏关注&#xff0c;会回访&#xff01; &#x1f4ac;舞台再大&#xff0c;你不上台&#xff0c;永远…

【java:牛客每日三十题总结-4】

java:牛客每日三十题总结 总结如下 总结如下 集合相关知识点 元素是否排序和插入顺序无关&#xff0c;取决与集合实现是否考虑了传入对象的java.lang.Comparable接口抽象类和接口相关知识 只能说越来越抽象了 java线程通信的方式 在Java中&#xff0c;常用的线程通信方式有两…

轻松下载网页音频和视频

在网页上看到好看的视频或者听到的音乐想保存&#xff0c;让我来教你&#xff08;仅供学习&#xff09; 注意&#xff1a;有极少部分的网站视频经过加密&#xff0c;无法下载 一、视频下载 1.打开视频网页 2.右键“检查” 3.刷新网页 4.按照下图中步骤操作 5.把复制的链接放…