hdu 5441

来源:互联网 发布:java加载配置文件 编辑:程序博客网 时间:2024/06/10 02:38
#include <iostream>#include <string.h>#include <set>#include <cstdio>#include <algorithm>#define ll long long#define N 20005#define M 100005using 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;}
0 0
原创粉丝点击