并查集
放上一篇写的比较好的博客:链接: https://blog.csdn.net/the_ZED/article/details/105126583.
注意
f
i
n
d
find
find函数要进行路径压缩
#include#include #include #include #include #include #define BUFF ios::sync_with_stdio(false),cin.tie(0),cout.tie(0) using namespace std; const int MOD = 2333; const int N = 1e6 + 5; const int INF = 0x3f3f3f3f; typedef long long ll; ll a[N], pre[N]; //ll find(ll x) { // while (x != pre[x]) // x = pre[x]; // return x; //} ll find(ll x) { if (x != pre[x]) pre[x] = find(pre[x]); return pre[x]; } void work() { ll n, m; cin >> n >> m; for (ll i = 1; i <= n; i++) { cin >> a[i]; pre[i] = i; } for (ll i = 1; i <= m; i++) { ll u, v; cin >> u >> v; ll fu = find(u); ll fv = find(v); pre[fu] = fv; a[fu] = a[fv] = max(a[fu], a[fv]); } ll ans = 0; for (ll i = 1; i <= n; i++) ans += a[find(i)]; cout << ans << 'n'; } int main() { BUFF; work(); return 0; }



