CF1276B Two Fair(BFS)

Two Fairs

题目大意:

  • 给出一张有 n 个结点、 m 条边的无向联通图;
  • 图上有两个特殊点 ab1a,bn, ab);
  • 求出满足下列条件的二元组 (u,v) 的对数:
    • 1u<vn
    • ua,va,ub,vb
    • 任意一条从 uv 的路径 (u,e1,e2,...,ek,v) 都经过 ab

思路:

  找出一条路径使得要经过a,b两点,先将图画出来.
img
  对于这张图来说,就是要选择a左侧的1,2,3b右侧的8,9,10这些点作为起始点拉出一条路径,这样一定会经过a,b两点。
img
  接下来就是要想办法处理出来a,b两端的点,可以考虑用bfs来将这些点搜索出来,每一次搜索都将a,b两点打上标记。
img
这样分别以a,b为起点搜索两次就可以得到两边的点是哪些。得到了两侧的点,剩下的答案统计就是一个乘法计数原理了.ans=a×b

void solve() { int n, m, a, b; std::cin >> n >> m >> a >> b; std::vector<std::vector<int>> adj(n + 1); for (int i = 0; i < m; i++) { int u, v; std::cin >> u >> v; adj[u].emplace_back(v); adj[v].emplace_back(u); } auto bfs = [&](int s) -> int { std::queue<int> q; q.push(s); std::vector<bool> vis(n + 1); vis[a] = vis[b] = true; while(q.size()) { int u = q.front(); q.pop(); for (auto& v : adj[u]) { if (!vis[v]) { vis[v] = true; q.push(v); } } } int ans = 0; for (int i = 1; i <= n; i++) ans += !vis[i]; return ans; }; int A = bfs(a), B = bfs(b); std::cout << 1ll * A * B << "\n"; }

__EOF__

本文作者HoneyGrey
本文链接https://www.cnblogs.com/Haven-/p/16734739.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   浅渊  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示