问题分析
这题用深搜广搜都能做,不过我更倾向于用广搜,因为广搜能更容易找到目标点。那么是采用结构体存储边还是采用二维数组存储临接矩阵呢?我们注意到n的取值范围为1e5,用二维数组哪怕是bool类型就需要至少1e10Byte的连续空间,这个空间太大了,申请不了,所有不能用二维数组。(悄悄告诉你,其实是可以的申请一个1e4 × \times × 1e4的二维数组,也能过,大概测试点的n值不会到达1e5,这属于出题人的失误了哈哈哈,他的意思还是想我们用结构体存储边来存储图的)
AC_Code
#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);//记录该点到各点的距离,初始化为-1visit[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——>beds.push_back({b,a});//b——>avec[a]++;vec[b]++;}for(int i=0;i<m;i++){cin>>a>>b;cout<<bfs(a,b)<<endl;}return 0;
}