原题链接:蓝桥杯2022年第十三届决赛真题-机房
解题思路:
注意事项:
参考代码:
#include <iostream> #include <vector> using namespace std; const int N = 200010; struct Query{ int y,id; }; vector<int> v[N]; vector<Query> query[N]; int cnt[N],res[N]; int st[N],p[N],dist[N]; int n,m; int Find(int x) { if(p[x] != x) p[x] = Find(p[x]); return p[x]; } void dfs(int u,int f) { for (int i = 0; i < v[u].size(); i ++ ) { int t = v[u][i]; if(t != f) { dist[t] = dist[u] + cnt[t]; dfs(t,u); } } } void tarjan(int u) { st[u] = 1; for (int i = 0; i < v[u].size(); i ++ ) { int t = v[u][i]; if(!st[t]) { tarjan(t); p[t] = u; } } for (auto item : query[u]) { int y = item.y,id = item.id; if(st[y] == 2) { int anc = Find(y); res[id] = dist[u] + dist[y] - 2 * dist[anc] + cnt[anc]; } } st[u] = 2; } int main() { cin >> n >> m; for (int i = 1; i < n; i ++ ) { int x,y; scanf("%d%d",&x,&y); v[x].push_back(y); v[y].push_back(x); cnt[x] ++,cnt[y] ++ ; } for (int i = 1; i <= n; i ++ ) dist[i] = cnt[i]; for (int i = 1; i <= m; i ++ ) { int x,y; scanf("%d%d",&x,&y); if(x == y) { res[i] = cnt[x]; continue; } query[x].push_back({y,i}); query[y].push_back({x,i}); } dfs(1,-1); for (int i = 1; i <= n; i ++ ) p[i] = i; tarjan(1); for (int i = 1; i <= m; i ++ ) printf("%d\n",res[i]); return 0; }
0.0分
4 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复