机房——蓝桥杯十三届2022国赛大学B组真题

问题分析

这题用深搜广搜都能做,不过我更倾向于用广搜,因为广搜能更容易找到目标点。那么是采用结构体存储边还是采用二维数组存储临接矩阵呢?我们注意到n的取值范围为1e5,用二维数组哪怕是bool类型就需要至少1e10Byte的连续空间,这个空间太大了,申请不了,所有不能用二维数组。(悄悄告诉你,其实是可以的申请一个1e4 × \times × 1e4的二维数组,也能过,大概测试点的n值不会到达1e5,这属于出题人的失误了哈哈哈,他的意思还是想我们用结构体存储边来存储图的)

AC_Code

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
vector<int> vec(N,0);//vec[i]:i结点有多少个邻接边
int n,m,a,b,result;
struct ed{
	int a,b;//两端结点
};
vector<ed> eds;//存储所有边
int bfs(int a,int b){
	if(a==b)return vec[a];//若起终相同
	queue<int> que;
	que.push(a);
	vector<int> visit(n+1,-1);//记录该点到各点的距离,初始化为-1
	visit[a]=vec[a];
	while(!que.empty()){
		int now=que.front();
		que.pop();
		for(int i=0;i<eds.size();i++){
			if(eds[i].a==now&&visit[eds[i].b]==-1){//如果该边与该点邻接且另一端未访问
				visit[eds[i].b]=visit[now]+vec[eds[i].b];//更新
				if(eds[i].b==b){//若达到目标点则返回
					return visit[b];
				}
				que.push(eds[i].b);
			}
		}
	}
	return visit[b];
}
int main() {
	
	cin>>n>>m;
	for(int i=0;i<n-1;i++){
		cin>>a>>b;
		eds.push_back({a,b});//a------>b
		eds.push_back({b,a});//b------>a
		vec[a]++;
		vec[b]++;
	}
	for(int i=0;i<m;i++){
		cin>>a>>b;
		cout<<bfs(a,b)<<endl;
	}
	return 0;
}
相关推荐
焦耳加热29 分钟前
阿德莱德大学Nat. Commun.:盐模板策略实现废弃塑料到单原子催化剂的高值转化,推动环境与能源催化应用
人工智能·算法·机器学习·能源·材料工程
wan5555cn36 分钟前
多张图片生成视频模型技术深度解析
人工智能·笔记·深度学习·算法·音视频
u6061 小时前
常用排序算法核心知识点梳理
算法·排序
鹅毛在路上了2 小时前
C++, ffmpeg, libavcodec-RTSP拉流,opencv实时预览
c++·opencv·ffmpeg
John_ToDebug2 小时前
定制 ResourceBundle 的实现与 DuiLib 思想在 Chromium 架构下的应用解析
c++·chrome·ui
蒋星熠3 小时前
Flutter跨平台工程实践与原理透视:从渲染引擎到高质产物
开发语言·python·算法·flutter·设计模式·性能优化·硬件工程
小欣加油4 小时前
leetcode 面试题01.02判定是否互为字符重排
数据结构·c++·算法·leetcode·职场和发展
3Cloudream4 小时前
LeetCode 003. 无重复字符的最长子串 - 滑动窗口与哈希表详解
算法·leetcode·字符串·双指针·滑动窗口·哈希表·中等
王璐WL4 小时前
【c++】c++第一课:命名空间
数据结构·c++·算法
aramae4 小时前
C++ -- 模板
开发语言·c++·笔记·其他