這種涉及不同連通分量的,看上去就可以用并查集。并查集的模板請參見上一篇內容。并查集(力扣1971)-CSDN博客
現在我們要求的是無法互相到達的點對。根據觀察易得,我們只需要求出每個并查集的元素數量,然后遍歷每個點,設它所在的并查集元素數量為size,那么它所不能到達的點的數量就為n-size.最后除2即可。
class Solution
{
public:int find(vector<int>& father, int u){return u == father[u] ? u : father[u] = find(father, father[u]);}void join(vector<int>& father, int u, int v){u = find(father, u);v = find(father, v);if (u == v) return;father[v] = u;}long long countPairs(int n, vector<vector<int>>& edges){vector<int>father(n);for (int i = 0; i < n; i++)//并查集初始化{father[i] = i;}unordered_map<int, int>mp;//mp.first:并查集的根值 mp.second:集合中元素的數量for (auto p : edges){join(father,p[0], p[1]);}for (int i = 0; i < n; i++){int root = find(father, i);//找到節點i的根值mp[root]++;//mp[root]:以root為根的并查集的元素數量}long long ans = 0;//查詢每一個點,看它所在的并查集中的元素的數量,設為size,則n-size是它不能訪問到的節點的數量for (int i = 0; i < n; i++){int root = find(father, i);//找到它的根節點ans += (n - mp[root]);}return ans / 2;}
};