forked from strang3-r/Leetcode75
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path2421. Number of Good Paths
66 lines (55 loc) · 1.71 KB
/
2421. Number of Good Paths
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
class Solution {
public:
vector<int> parent, rank;
int find(int p) {
if (parent[p] == -1) return p;
return parent[p] = find(parent[p]);
}
bool UNION(int p, int q) {
int i = find(p);
int j = find(q);
if (i==j) return false;
if (rank[i] < rank[j]){
parent[i] = j;
rank[j]+=rank[i];
}
else {
parent[j] = i;
rank[i]+=rank[j];
}
return true;
}
int numberOfGoodPaths(vector<int>& vals, vector<vector<int>>& edges) {
int n=vals.size(),goodPaths=0;
parent.resize(n,-1);
rank.resize(n,1);
vector<vector<int>> adj(n);
map<int, vector<int>> sameValues;//Map is req bcz we have to start with smaller values else grp will contain larger values as well
for (int i = 0; i < n; i++) {
sameValues[vals[i]].push_back(i);
}
for (auto &e : edges) {
int u = e[0], v = e[1];
if (vals[u] >= vals[v]) {
adj[u].push_back(v);
} else if (vals[v] >= vals[u]) {
adj[v].push_back(u);
}
}
for(auto &[value, allNodes] : sameValues){
for(auto it:allNodes){
for(auto itr:adj[it])
UNION(it,itr);
}
unordered_map<int, int> group;
for (int u : allNodes) {
group[find(u)]++;
}
goodPaths += allNodes.size();
for(auto it:group){
goodPaths+=(it.second*(it.second-1))/2;
}
}
return goodPaths;
}
};