实验4 图的应用问题 给定n个村庄之间的交通图,现计划在n个村庄中选定一个村庄建造一所医院,请设计方案解决问题

这篇具有很好参考价值的文章主要介绍了实验4 图的应用问题 给定n个村庄之间的交通图,现计划在n个村庄中选定一个村庄建造一所医院,请设计方案解决问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

数据结构的某次编程实验

【问题描述】

给定n个村庄之间的交通图,现计划在n个村庄中选定一个村庄建造一所医院,请设计方案解决如下问题:
(1)求出该医院应建在哪个村庄,才能使距离最远的村庄到医院的路程最短;
(2)求出该医院应建在哪个村庄,能使其它所有村庄到医院的路径总和最短。

对于如上所示的无向图,设置输入形式如下:

5 //结点个数
A B C D E//输入多个结点值,每个值之间用一个空格隔开
6 //边个数
A B 5 //第1条边的顶点和权值,中间用一个空格隔开
A C 6 //第2条边的顶点和权值,中间用一个空格隔开
A D 3 //第3条边的顶点和权值,中间用一个空格隔开
D E 10 //第4条边的顶点和权值,中间用一个空格隔开
E C 15 //第5条边的顶点和权值,中间用一个空格隔开
C B 7 //第6条边的顶点和权值,中间用一个空格隔开

【输出形式】

D //D村庄1
A //村庄2

实验4 图的应用问题 给定n个村庄之间的交通图,现计划在n个村庄中选定一个村庄建造一所医院,请设计方案解决问题

【样例输入】

5
A B C D E
6
A B 5
A C 6
A D 3
D E 10
E C 15
C B 7

【样例输出】

D
A

注:本题运用Dijkstra算法,Dijkstra算法讲解请参考我的另一博文->[点击此处跳转]文章来源地址https://www.toymoban.com/news/detail-424748.html

C++代码实现

#include<iostream>
using namespace std;
#include<limits.h>   //包含int等类型的最值,若两点不连通则该两点的虚边权值为INT_MAX
struct graph {
	char vertlist[100];   //节点名称(如A B C...)
	int edgelist[100][100];   //邻接矩阵
	int n, e;   // n 为nodes' count, e 为edges' count
};
struct table {   //标记当前顶点状态
	bool visited;   //标记当前顶点是否已被访问
	int distance, path;   //当前顶点与各个顶点的最小距离(distance)和经过的顶点
};
void CreateGraph(graph*& g) {
	g = new graph;
	cin >> g->n;   //输入顶点个数
	for (int i = 1; i <= g->n; i++) {
		cin >> g->vertlist[i];   //输入顶点名称(如A B C...)
		for (int j = 1; j <= g->n; j++) {   //初始化邻接矩阵
			if (i != j) g->edgelist[i][j] = INT_MAX;
			else g->edgelist[i][j] = 0;
		}
	}
	cin >> g->e;   //输入边个数
	char temp1, temp2;
	int weight, adj1, adj2;
	for (int i = 1; i <= g->e; i++) {   //将输入的信息转为邻接矩阵储存
		cin >> temp1 >> temp2 >> weight;
		for (int j = 1; j <= g->n; j++) {
			if (g->vertlist[j] == temp1) adj1 = j;
			if (g->vertlist[j] == temp2) adj2 = j;
		}
		g->edgelist[adj1][adj2] = weight;
		g->edgelist[adj2][adj1] = weight;   //无向图需交换邻接点再次录入边信息
	}
}
int Findmin(graph* g, table* t) {   //找到距离最进的顶点
	int min = INT_MAX, adjmin;
	for (int i = 1; i <= g->n; i++)
		if (!t[i].visited && t[i].distance < min) {
			min = t[i].distance;
			adjmin = i;
		}
	return adjmin;
}
void Dijkstra(graph* g, table* t, int flag) {   //从flag顶点出发,求到各个顶点的距离distance(Dijkstra算法)
	for (int i = 1; i <= g->n; i++) {
		t[i].distance = g->edgelist[flag][i];
		t[i].visited = false;
		t[i].path = flag;
	}
	t[flag].visited = true;
	int sum, adjmin;
	for (int i = 1; i < g->n; i++) {   //因为flag顶点已被选出,因此还需选出n-1个顶点
		adjmin = Findmin(g, t);
		t[adjmin].visited = true;
		for (int j = 1; j <= g->n; j++)
			if (!t[j].visited && g->edgelist[adjmin][j] < INT_MAX) {   //注:无向图一定要判断 g->edgelist[adjmin][j]<INT_MAX
				sum = t[adjmin].distance + g->edgelist[adjmin][j];
				if (sum < t[j].distance) {
					t[j].distance = sum;
					t[j].path = adjmin;
				}
			}
	}
}
int main() {
	graph* g;
	CreateGraph(g);
	table t[100][100];
	for (int i = 1; i <= g->n; i++)
		Dijkstra(g, t[i], i);   //从i顶点出发,求到各个顶点的距离distance,存储在t[i]里
	int farthest[100],tempfar;   //farthest[i]为储存从第i顶点出发到最远顶点的最短距离
	for (int i = 1; i <= g->n; i++) {
		tempfar = 0;
		for (int j = 1; j <= g->n; j++)
			if (tempfar < t[i][j].distance)
				tempfar = t[i][j].distance;
		farthest[i] = tempfar;
	}
	int min = INT_MAX, adjmin;   //adjmin为最小值的下标
	for(int i=1;i<=g->n;i++)
		if (min > farthest[i]) {
			min = farthest[i];
			adjmin = i;   //adjmin为到最远顶点的最短距离的最小值的出发顶点下标
		}
	cout << g->vertlist[adjmin] << endl;   //输出第一问题的解
	int sum[100] = { 0 };   //从i顶点出发,求到各个顶点的最短距离之和
	for (int i = 1; i <= g->n; i++)
		for (int j = 1; j <= g->n; j++)
			sum[i] += t[i][j].distance;
	min = INT_MAX;   //min重置为很大的数
	for (int i = 1; i <= g->n; i++)   //找到以adjmin顶点出发路径总和最短
		if (min > sum[i]) {
			min = sum[i];
			adjmin = i;
		}
	cout << g->vertlist[adjmin] << endl;   //输出第二问题的解
	return 0;
}

到了这里,关于实验4 图的应用问题 给定n个村庄之间的交通图,现计划在n个村庄中选定一个村庄建造一所医院,请设计方案解决问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构:地图着色问题——图的应用——回溯法

    目录 前言 一、解决问题的思路 二、存储结构设计 三、代码 1.创建图函数 2.判断色号是否相同函数 3.回溯函数 4.整体代码 总结 本次解决的问题:用图模拟部分地图,对各省进行着色,要求相邻省所使用的颜色不同,并保证使用的颜色总数最少。 先来一张效果图 将邻接矩阵

    2024年02月04日
    浏览(54)
  • 实验5 MapReduce初级编程实践(3)——对给定的表格进行信息挖掘

    通过实验掌握基本的MapReduce编程方法; 掌握用MapReduce解决一些常见的数据处理问题,包括数据去重、数据排序和数据挖掘等。 操作系统:Linux(建议Ubuntu16.04或Ubuntu18.04) Hadoop版本:3.1.3 下面给出一个child-parent的表格,要求挖掘其中的父子辈关系,给出祖孙辈关系的表格。

    2024年02月10日
    浏览(44)
  • 实验(八):交通灯控制

            1. 学习模拟交通灯控制的实现方法;         2. 掌握Proteus硬件仿真与调试。         1.根据要求编写程序,并写出原理性注释;         2. 将检查程序运行的结果,分析一下是否正确;         3. 完成所建工程的仿真及调试。 按照电路要求在Protu

    2024年02月03日
    浏览(53)
  • FPGA实验四:交通灯控制器设计

    目录 一、实验目的 二、设计要求 三、实验代码 1.design source文件代码

    2024年02月13日
    浏览(52)
  • 西南交通大学 计算机组成原理实验课程设计

     代码部分: 波形图部分: (上图Load为2节拍,我之前写错了。。。这里忘了改了)

    2024年02月13日
    浏览(49)
  • 图的最短路径 (数据结构实验报告)

    一、实验目的 讲清楚进行本实验后要学到的知识、掌握的数据结构及其定义和表示方法,讲清楚所采用的算法。 掌握图结构的(邻接矩阵)输入方法 掌握图结构的说明、创建以及图的存储表示(邻接矩阵) 掌握最短路径算法原理 掌握最短路径算法的编程实现方法 二、实验

    2024年02月06日
    浏览(50)
  • EDA实验(Quartus Ⅱ+fpga) (四)---交通灯设计

    前言: 本文主要介绍了EDA原理与应用这门课程的相关实验及代码。使用的软件是Quartus Ⅱ,该实验使用fpga芯片为cycloneⅤ 5CSEMA5F31C6。 (一)实验目的 (1)熟悉交通灯控制器的工作原理; (2)了解设计中的优化方案; (3)进一步掌握状态机的设计; (4)学习较复杂数字系

    2024年02月02日
    浏览(59)
  • 数据结构上机实验——图的实现(以无向邻接表为例)、图的深度优先搜索(DFS)、图的广度优先搜索(BFS)

      图采用邻接表存储结构,编程实现图的深度优先搜索和广度优先搜索算法。              2.1创建图 2.1.1定义图的顶点、边及类定义   我们定义一个 邻接表类(ALGraph) 。这里实现一些基础的数据结构。要注意结构体的嵌套。    Edge: 用于表示图中的边

    2024年02月04日
    浏览(54)
  • 《数据结构》实验报告六:图的表示与遍历

    1、掌握图的 邻接矩阵 和 邻接表 表示 2、掌握图的 深度优先 和 广度优先 搜索方法 3、理解 图的应用 方法 说明以下概念 1、深度优先搜索遍历:        一种图的遍历方式:从图中 任意一个 起始顶点 V 出发,接着访问它的任意一个 邻接顶点 W1 ;再从 W1 出发,访问与 W1

    2024年02月06日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包