幸福小镇的故事!(简单)
在一个很远很远的地方,有一个幸福小镇!
幸福小镇的治安很不好,所以生活在镇上很不幸福!
新来的保安队队长小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;
}

浙公网安备 33010602011771号