代码如下
#include <algorithm>
#include <climits>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <deque>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
#define LL long long
#define UIT unsigned int
#define DB double
#define PII pair<int, int>
#define MKPR(a, b) make_pair(a, b)
#define MMST(a) memset(a, 0, sizeof(a))
#define PB push_back
#define FOR(i, beg, ed, s) for (int i = beg; i < ed; i += s)
#define FORE(i, beg, ed, s) for (int i = beg; i <= ed; i += s)
#define LOOP while (true)
#define IN scanf
#define OUT printf
using namespace std;
vector<int> f;
vector<PII> a;
vector<vector<int>> mp;
vector<bool> vis;
bool cmp(const PII& a, const PII& b) {
if (a.first == b.first) {
return a.second < b.second;
}
return a.first > b.first;
}
int find(int x) {
int r = x;
while (r != f[r]) {
r = f[r];
}
int t = x;
int tmp = 0;
while (t != tmp) {
tmp = f[t];
f[t] = r;
t = tmp;
}
return r;
}
void uni_set(int x, int y) {
int xx = find(x);
int yy = find(y);
if (xx != yy) {
f[xx] = yy;
}
}
void solve() {
int t = 0, m = 0, n = 0;
int x = 0, y = 0;
int cnt = 0;
LL ans = 0;
IN("%d", &t);
while (t--) {
IN("%d%d", &n, &m);
f.resize(n + 1);
mp.resize(n + 1);
a.resize(n + 1);
vis.resize(n + 1);
FORE(i, 1, n, 1) {
IN("%d", &a[i].first);
a[i].second = i;
mp[i].clear();
f[i] = i;
vis[i] = false;
}
sort(a.begin() + 1, a.end(), cmp);
a.PB(MKPR(0, 0));
ans = 0;
cnt = 0;
while (m--) {
IN("%d%d", &x, &y);
mp[x].PB(y);
mp[y].PB(x);
}
FORE(i, 1, n, 1) {
cnt++;
vis[a[i].second] = true;
for (auto it : mp[a[i].second]) {
if (vis[it]) {
if (find(it) != find(a[i].second)) {
cnt--;
uni_set(it, a[i].second);
}
}
}
ans += 1LL * cnt * (a[i].first - a[i + 1].first);
}
OUT("%lld\n", ans);
}
}
int main(void) {
solve();
return 0;
}