数据结构课设:神秘国度的爱情故事

本文介绍了一道编程题,涉及一个神秘国度的村庄网络,其中任意两个村庄间存在唯一路径。问题在于判断某村庄是否位于另外两个村庄间的路径上。通过分析,确定采用数据结构中的无向图和邻接表来解决问题,并利用广度优先搜索进行路径查找。文章还提到了生成测试数据的方法以及将问题抽象为类的设计思路。
摘要由CSDN通过智能技术生成

神秘国度的爱情故事

题目要求:某个太空神秘国度中有很多美丽的小村,从太空中可以想见,小村间有路相连,更精确一点说,任意两村之间有且仅有一条路径。小村 A 中有位年轻人爱上了自己村里的美丽姑娘。每天早晨,姑娘都会去小村 B 里的面包房工作,傍晚 6 点回到家。年轻人终于决定要向姑娘表白,他打算在小村 C 等着姑娘路过的时候把爱慕说出来。问题是,他不能确定小村 B 是否在小村 A到小村 C 之间的路径上。你可以帮他解决这个问题吗?

输入 :第一行是村庄的个数M,接下来M-1行每行两个树Va,Vb表示哪些村庄是直接相连的,之后是提问次数N,接下来N行每行3个整数va,vb,vc,每组发问若vb在va与vc的必经之路上则输出"yes",否则输出"No".


分析

  • 题目中有个非常重要的信息:任意两个村之间有且仅有一条路径。
  • 这容易让我们联想到数据结构中的树结构,正好符合这个特征。
  • 但是结合情景,村庄之间并不存在树节点的父子关系,所以这个数据结构又是一个无向图,并且无环。
  • 再回来分析问题,可以分成两部分,第一是找到A村与C村的路径,第二是判断B村是否在这个路径上。
  • 最后我们在实现上可以选择邻接表作为存储数据的结构,结合广度优先搜索,从A点开始不断探索无向图,同时需要记录来路,方便之后回溯。BFS完成后则从C点开始沿着BFS的轨迹进行回溯,直至会带起点A。更具路径中是否出现B点即可判断结果。
  • 为了生成大量的测试数据,我们可以做一个函数,随机生成一个有数万个节点的无向连通图。然后再生成多个不重复的随机数。用重定向的方法将输入输出重定向到文件流,避免直接从控制台复制黏贴大量数据。
  • 为了让程序的思路更加清晰简洁,我们可以将这个神秘国度抽象成一个类,将构建村庄连接关系,判断三个村庄是否同一路径等方法以及保存村庄关系的邻接表封装起来。

以下是主要思路
过程与思路
以下是类图
类图

生产输入数据的代码
//it function is used to create mock input data, useally ouput to an txt file
void createInputData(int dataNum, int requireNum){
   
	if (dataNum<3 || dataNum>maxn || requireNum <= 0 || requireNum > maxn) {
   
		puts("input data seen not right, please check!");
		return;
	}
	cout << "query" << endl;
	cout << dataNum - 1 << endl;

	//create an random array that each number would only appear once
	vector<int> tmpVec;
	for (int i = 0; i < dataNum; i++){
   	//note that the index of village is start from 0
		tmpVec.push_back(i);
	}
	srand(time(0));
	random_shuffle(tmpVec.begin(), tmpVec.end());

	//create an tree to simulate the connection of all village
	queue<int> tmpQue;
	int index = 0;
	tmpQue.push(tmpVec[index++]);
	int remain = dataNum - 1;	//the number of village taht still not join to the tree
	while (!tmpQue.empty()){
   
		int target = tmpQue
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值