类似与最小生成树的算法,将边和询问分别按照权值排序,每次枚举一个询问,将小于该询问的边全部链接,并且计算ans。
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn = 20005;
const int maxm = 100005;
const int maxq = 5005;
struct Edge {
int u, v, w;
Edge(int u = 0, int v = 0, int w = 0): u(u), v(v), w(w) {}
bool operator < (const Edge& a) const { return w < a.w; }
}E[maxm], Q[maxq];
int N, M, K, F[maxn], S[maxn];
ll ans[maxn];
int find(int x) { return x == F[x] ? x : F[x] = find(F[x]); }