hdu 5441 并查集+排序

来源:互联网 发布:简述算法的复杂度分析 编辑:程序博客网 时间:2024/04/30 22:57
#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<algorithm>using namespace std;const int maxm=1e5+5;const int maxn=2*1e4+5;const int maxq=5*1e3+5;struct edge{int from,to,cost;}e[maxm];struct node{int num,time,res;}tp[maxq];int par[maxn],cnt,cnt1,n,m,q,j,num[maxn];bool cmp(edge a,edge b){    if(a.cost==b.cost)    {        if(a.from==b.from)            return a.to<b.to;        return a.from<b.from;    }    return a.cost<b.cost;}bool comp(node a,node b){    if(a.time==b.time)        return a.num<b.num;    return a.time<b.time;}bool cmop(node a,node b){    return a.num<b.num;}int find(int num){    if(par[num]==num)        return num;    return par[num]=find(par[num]);}void init(){    j=0;    cnt=0;    for(int i=0;i<=n;i++)    {        num[i]=1;        par[i]=i;    }}int main(){    int t,i;    scanf("%d",&t);    while(t--&&scanf("%d%d%d",&n,&m,&q)!=EOF)    {        init();        for(i=0;i<m;i++)            scanf("%d%d%d",&e[i].from,&e[i].to,&e[i].cost);        sort(e,e+m,cmp);        for(i=0;i<q;i++)        {            scanf("%d",&tp[i].time);            tp[i].num=i;        }        sort(tp,tp+q,comp);        for(i=0;i<q;i++)        {            for(;(e[j].cost<=tp[i].time)&&j<m;j++)            {                int fa=find(e[j].from),fb=find(e[j].to);                if(fa!=fb)                {                    cnt+=num[fa]*num[fb];//这里最好玩                    par[fa]=fb;                    num[fb]+=num[fa];                }            }            tp[i].res=cnt*2;        }        sort(tp,tp+q,cmop);        for(i=0;i<q;i++)            printf("%d\n",tp[i].res);    }    return 0;}

0 0
原创粉丝点击