#include <iostream>
#include <string.h>
#include <set>
#include <cstdio>
#include <algorithm>
#define ll long long
#define N 20005
#define M 100005
using namespace std;
int father[N];
int find(int x)
{
if (father[x]!=x) return father[x]=find(father[x]);
else return x;
}
ll ans[5005],num[N];
void join(int x,int y)
{
int fx = find(x),fy = find(y);
if(fx!=fy)
father[fx] = fy;
}
ll Union(int x,int y)
{
int rx,ry;
rx = find(x);
ry = find(y);
if (rx==ry) return 0;
father[rx] = ry;
ll res=num[ry]*num[rx]*2;
num[ry]+=num[rx];
return res;
}
struct Limit
{
int num,cnt;
}limit[5005];
bool cmp(Limit a,Limit b)
{
return a.num<b.num;
}
struct Edge
{
int u,v,value;
}edge[M];
bool cmp_edge(Edge a, Edge b)
{
return a.value<b.value;
}
int n,m,q;
int main()
{
int T;
scanf("%d",&T);
while (T--)
{
scanf("%d%d%d",&n,&m,&q);
for (int i=1;i<=n;i++)
{
father[i]=i;
num[i]=1;
}
for (int i=1;i<=m;i++)
scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].value);
for (int i=1;i<=q;i++)
{
scanf("%d",&limit[i].num);
limit[i].cnt=i;
}
sort(edge+1,edge+m+1,cmp_edge);
sort(limit+1,limit+q+1,cmp);
ll res=0;
int j=1;
for (int i=1;i<=q;i++)
{
while (edge[j].value<=limit[i].num && j<=m )
{
int u=edge[j].u;
int v=edge[j].v;
res+=Union(u,v);
j++;
}
ans[limit[i].cnt]=res;
}
for (int i=1;i<=q;i++)
printf("%lld\n",ans[i]);
}
return 0;
}
hdu 5441
最新推荐文章于 2022-04-29 20:53:54 发布