题面如上。
本题考查的是并查集的知识,没学的先去学一下并查集。
很明显,对于某些人互为朋友关系的,他们的吃瓜量均为他们之中目标吃瓜的最大值。其余没有朋友关系的均为其目标值,这样就可以让所有人开心。
注意当n == 10 ^ 6,吃瓜量均为 10 ^ 9 时,答案为 10 ^ 15,会爆 int,所以要开 long long
代码如下。
#include<bits/stdc++.h>
#define endl '\n'
typedef long long ll;
typedef unsigned long long ull;
const ll mod = 998244353;
using namespace std;
int fa[4000010];
int a[4000010];
int find(int x) {
return x == fa[x] ? x : fa[x] = find(fa[x]); //并查集优化模板
}
void merge(int x, int y) {
int f1 = find(x), f2 = find(y);
fa[f2] = f1; //合并操作
a[f1] = max(a[f1], a[f2]); //比较谁的父结点的瓜值更大并赋值
}
int main() {
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++) {
fa[i] = i; //并查集初始化
}
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
for (int i = 1; i <= m; i++) {
int x, y;
cin >> x >> y;
merge(x, y);
}
ll sum = 0; //注意开longlong
for (int i = 1; i <= n; i++) {
sum += a[find(i)];
}
cout << sum;
return 0;
}