• Codeforces 437 D. The Child and Zoo 并查集


    题目链接:D. The Child and Zoo

    题意:

      题意比较难懂,是指给出n个点并给出这些点的权值,再给出m条边。每条边的权值为该条路连接的两个区中权值较小的一个。如果两个区没有直接连接,那么f值即为从一个区走到另一个区中所经过的路中权值最小的值做为权值。如果有多条路的话,要取最大的值作为路径的长度。问,平均两个区之间移动的权值为多少。

    题解:

      每条边的长度已经知道了,因为路径的权值取这条路中最小的且多条路的话则取较大的,那么我们其实可以从比较大的边开始取(先把边排序),用并查集开始合并边。这样前面的操作就不会影响后面的操作。每合并两个区间就将答案加上两个点的数量的乘积与当前这条边的权值的乘积。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int MAX_N = 1e5+9;
     4 struct node
     5 {
     6     long long f,t,v;
     7 };
     8 node edge[MAX_N];
     9 bool cmp(const node a,const node b)
    10 {
    11     return a.v > b.v;
    12 }
    13 long long ans = 0;
    14 int fat[MAX_N];
    15 long long val[MAX_N];
    16 long long num[MAX_N];
    17 vector<int> vec[MAX_N];
    18 int Find(int x)
    19 {
    20     if(fat[x] == x)
    21     {
    22         return x;
    23     }
    24     int y = Find(fat[x]);
    25     return fat[x] = y;
    26 }
    27 void mix(int x,int y,int v)
    28 {
    29     int fx = Find(x);
    30     int fy = Find(y);
    31     if(fx == fy) return;
    32     fat[fx] = fy;
    33     ans += num[fx]*num[fy]*v;
    34     num[fy] += num[fx];
    35     //cout<<num[fx]<<"....."<<num[fy]<<"...."<<ans<<endl;
    36 }
    37 int main()
    38 {
    39     int N,M,T;
    40     while(cin>>N>>M)
    41     {
    42         ans = 0;
    43         for(int i=0;i<N;i++) vec[i].clear();
    44         for(int i=1;i<=N;i++)
    45         {
    46             scanf("%lld",&val[i]);
    47             fat[i] = i;
    48             num[i] = 1;
    49         }
    50         for(int i=0;i<M;i++)
    51         {
    52             scanf("%lld%lld",&edge[i].f,&edge[i].t);
    53             edge[i].v = min(val[edge[i].f],val[edge[i].t]);
    54         }
    55         sort(edge,edge+M,cmp);
    56         for(int i=0;i<M;i++)
    57         {
    58             mix(edge[i].f,edge[i].t,edge[i].v);
    59         }
    60         printf("%.6lf
    ",2.0*ans/(N*1.0*(N-1)));
    61     }
    62     return 0;
    63 }
  • 相关阅读:
    minikube dashboard 403 forbidden
    kubernetes 条件需求 修改内核和系统启动项
    kali 2020汉化 设置中文
    mac Memcached安装及基本命令-转载
    转载——Linux性能剖析工具—perf
    Django-migrations中的迁移版本和数据库中的迁移版本对不上怎么办?
    下载yum源中的rpm包
    server2008 安装mysql8.0
    好累啊!
    我与游戏
  • 原文地址:https://www.cnblogs.com/doggod/p/8366622.html
Copyright © 2020-2023  润新知