幸福小镇的故事!(简单)

在一个很远很远的地方,有一个幸福小镇!
幸福小镇的治安很不好,所以生活在镇上很不幸福!
新来的保安队队长小Z决心改变这一切,第一步要解决的是任何两个小镇之间的距离问题!
我们需要解决这个问题的简化版本:
幸福小镇可以划分为N个小小镇,从1到N编号!这些小小镇由N-1条道路连通,我们把每条道路的长度简化为1!只要在每个小小镇增派人手,就可以让小镇的治安情况变得越来越好!(题目保证两个小镇之间的道路只有一条!)
每次小Z会询问你两个小小镇的编号,请你计算出这两个小镇之间的最短路径长度!

输入格式:

第一行包含一个正整数(N<=1000),表示小小镇的个数!
接下来N-1行,每行包含两个1到N之间的整数,表示这两个编号的小小镇之间有一条路!
接下来一行包含一个整数q(q<=100),表示询问数!
接下来q行,每行包含两个小小镇的编号,请在一行中输出这两个小小镇的最短路径长度!

输出格式:

输出答案即可!

输入样例:

在这里给出一组输入。例如:

10
1 2
2 3
1 4
4 5
4 6
3 7
3 8
1 9
9 10
5
3 8
9 3
1 1
1 7
1 9

输出样例:

在这里给出相应的输出。例如:

1
3
0
3
1

这是一道简单的广度优先搜索题目,但是我还是看了多久的书才做出来的(太菜了!)。这道题目只是需要注意一些细节问题,就是在每次搜索完一组数据后要将标记数组的元素重新置为false。

#include <iostream>
#include <queue>
#include <cstring>

using namespace std;

int G[1005][1005] = {0};		// 邻接矩阵 
bool vis[1005] = {false};		// 标记各节点的访问状态,如节点已访问则为true,否则为false 
int n;							// 节点的个数 

// 定义节点 
typedef struct{
	int id;			// 节点编号 
	int layer;		//  节点层级 
}Node;

Node BFS(int s, int e){
	queue<Node> q;		// 队列用于存放节点 
	Node start;			// 开始节点 
	start.id = s;
	start.layer = 0;
	q.push(start);		// 将开始节点放入队列中 
	vis[start.id] = true;	// 将放入队列中的节点标记为true 
	while(!q.empty()){
		Node topNode = q.front();		// 拿出队首元素 
		if(topNode.id == e){			// 判读此时的队首元素是否是终点节点,若是则返回节点 
			return topNode;
		}
		q.pop();
		// 找出此时队首节点的邻接节点 
		for(int i = 1; i <= n; i++){
			if(vis[i] == false && G[topNode.id][i] == 1){
				Node t;
				t.id = i;
				t.layer = topNode.layer + 1;
				q.push(t);
				vis[i] = true;
			}
		}
	}
	
}

int main(){
	cin >> n;		// 输入节点个数
	// 初始化临界矩阵 
	for(int i = 0; i < n-1; i++){
		int x, y;
		cin >> x >> y;
		G[x][y] = 1;
		G[y][x] = 1;
	}
	int q;
	cin >> q;			// 输入询问次数 
	for(int i = 0; i < q; i++){
		int x, y;
		cin >> x >> y;
		Node topNode = BFS(x,y);		// 广度优先搜索 
		cout << topNode.layer << endl;
		memset(vis, false, sizeof(vis));	// 将标记数组重置,一定一定要记住!!! 
	}
	return 0;
}
posted @ 2021-05-22 21:13  南国之川  阅读(850)  评论(0)    收藏  举报