绵阳网站建设报价西安响应式网站
news/
2025/10/6 5:00:13/
文章来源:
绵阳网站建设报价,西安响应式网站,网站开发实训感想,哪个公司做网站推广最好【LetMeFly】2316.统计无向图中无法互相到达点对数#xff1a;广度优先搜索#xff08;BFS#xff09;
力扣题目链接#xff1a;https://leetcode.cn/problems/count-unreachable-pairs-of-nodes-in-an-undirected-graph/
给你一个整数 n #xff0c;表示一张 无向图 中…【LetMeFly】2316.统计无向图中无法互相到达点对数广度优先搜索BFS
力扣题目链接https://leetcode.cn/problems/count-unreachable-pairs-of-nodes-in-an-undirected-graph/
给你一个整数 n 表示一张 无向图 中有 n 个节点编号为 0 到 n - 1 。同时给你一个二维整数数组 edges 其中 edges[i] [ai, bi] 表示节点 ai 和 bi 之间有一条 无向 边。
请你返回 无法互相到达 的不同 点对数目 。 示例 1 输入n 3, edges [[0,1],[0,2],[1,2]]
输出0
解释所有点都能互相到达意味着没有点对无法互相到达所以我们返回 0 。示例 2 输入n 7, edges [[0,2],[0,5],[2,4],[1,6],[5,4]]
输出14
解释总共有 14 个点对互相无法到达
[[0,1],[0,3],[0,6],[1,2],[1,3],[1,4],[1,5],[2,3],[2,6],[3,4],[3,5],[3,6],[4,6],[5,6]]
所以我们返回 14 。提示
1 n 1050 edges.length 2 * 105edges[i].length 20 ai, bi nai ! bi不会有重复边。
方法一广度优先搜索BFS
这道题的关键就是统计出每个子图的大小。假设原图是由大小为a、b、c的三个子图构成的那么答案 a n s a × ( b c ) b × ( a c ) c × ( a b ) a × ( n − a ) b × ( n − b ) c × ( n − c ) ans a\times(b c) b\times(ac)c\times(ab) a\times (n-a)b\times(n-b)c\times(n-c) ansa×(bc)b×(ac)c×(ab)a×(n−a)b×(n−b)c×(n−c)。
怎么统计出每个子图有多少个节点呢广搜一遍就行了。使用visited数组来记录哪个节点被遍历过从 0 0 0到 n − 1 n-1 n−1枚举遇到没遍历过的节点就开始广搜统计这个子图的节点个数并标记处理过的节点。
时间复杂度 O ( n l e n ( e d g e s ) ) O(n len(edges)) O(nlen(edges))空间复杂度 O ( n l e n ( e d g e s ) ) O(n len(edges)) O(nlen(edges))
AC代码
C
typedef long long ll;
class Solution {
public:ll countPairs(int n, vectorvectorint edges) {vectorvectorint graph(n);for (auto v : edges) {graph[v[0]].push_back(v[1]);graph[v[1]].push_back(v[0]);}vectorll sizes;vectorbool visited(n);for (int i 0; i n; i) {if (visited[i]) {continue;}int cntNode 0;visited[i] true;queueint q;q.push(i);while (q.size()) {int thisNode q.front();cntNode;q.pop();for (int t : graph[thisNode]) {if (!visited[t]) {visited[t] true;q.push(t);}}}sizes.push_back(cntNode);}ll ans 0;for (ll t : sizes) {ans t * (n - t);}return ans / 2;}
};Python
# from typing import Listclass Solution:def countPairs(self, n: int, edges: List[List[int]]) - int:graph [[] for _ in range(n)]for a, b in edges:graph[a].append(b)graph[b].append(a)visited [False] * nsizes []for i in range(n):if visited[i]:continuecntNode 0visited[i] Trueq [i]while q:thisNode q.pop()cntNode 1for t in graph[thisNode]:if not visited[t]:visited[t] Trueq.append(t)sizes.append(cntNode)ans 0for t in sizes:ans t * (n - t)return ans // 2 同步发文于CSDN原创不易转载经作者同意后请附上原文链接哦~ Tisfyhttps://letmefly.blog.csdn.net/article/details/133962709
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/928997.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!