hdu 4750 最小生成树

来源:互联网 发布:php所有的数据类型 编辑:程序博客网 时间:2024/06/02 02:52

题意:南京理工大学有很多景点。两个景点组成一对。两个景点的价值用这种方式计算:设两个景点之间一条路径中最长的一条路的距离是s,这两个景点的价值f就是所有路径中s的最小值。游客想要找价值大于等于t的景点对有多少个。

#include <stdio.h>#include<vector>#include <string.h>#include<algorithm>using namespace std;struct node{    int u,v,val;}e[500005];bool cmp(node a,node b){    return a.val<b.val;}long long  rank1[500005],f[500005],ans[500005],len[500005];int find(int x){    if(f[x]==x)        return x;    else return f[x]=find(f[x]);}int main(){int n,m;while(~scanf("%d%d",&n,&m))    {        for(int i=0;i<m;i++)        {            scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].val);        }        for(int i=0;i<=n;i++)        {            f[i]=i;            rank1[i]=1;        }        sort(e,e+m,cmp);        int sum=n-1;        int top=2;        for(int i=0;i<m;i++)        {            int x=find(e[i].u);            int y=find(e[i].v);            if(x!=y)            {                len[top]=e[i].val;                ans[top++]=rank1[x]*rank1[y]*2;                rank1[y]+=rank1[x];                f[x]=y;            }        }       ans[0]=ans[1]=len[0]=len[1]=0;        for(int i=1;i<top;i++)        {            ans[i]+=ans[i-1];            //printf("%lld\n",len[i]);        }        int k;        scanf("%d",&k);        for(int i=0;i<k;i++)        {            int t;            scanf("%d",&t);            int pos=lower_bound(len,len+top,t)-len-1;           // printf("....%lld %lld %d....\n",ans[top-1],ans[pos],pos);            printf("%lld\n",ans[top-1]-ans[pos]);        }    }}

原创粉丝点击