Advertisement
istinishat

DSU

Apr 8th, 2018
257
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //http://codeforces.com/problemset/problem/437/D
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4.  
  5. #define si(n) scanf("%d",&n)
  6. #define f first
  7. #define s second
  8. #define mp(a,b) make_pair(a,b)
  9. #define MAX 100005
  10.  
  11. int n,m,par[MAX];
  12.  
  13. int root(int v){return par[v]<0?v:(par[v]=root(par[v]));}
  14.  
  15. void union_set(int u,int v)
  16. {
  17.     if((u=root(u))==(v=root(v)))return ;
  18.     if(par[u]>par[v])swap(u,v);
  19.     par[u]+=par[v];
  20.     par[v]=u;
  21. }
  22.  
  23.  
  24. vector<int>gr[MAX];
  25. int vis[MAX];
  26.  
  27. int main()
  28. {
  29.     int i,j;
  30.     si(n);si(m);
  31.     memset(par,-1,sizeof(par));
  32.     vector<pair<int,int> >all;
  33.  
  34.     for(i=0;i<n;i++){
  35.         int w;
  36.         si(w);
  37.         all.push_back(mp(w,i));
  38.     }
  39.     sort(all.begin(),all.end());
  40.  
  41.     for(i=0;i<m;i++){
  42.         int u,v;
  43.         si(u);si(v);u--;v--;
  44.         gr[u].push_back(v);
  45.         gr[v].push_back(u);
  46.     }
  47.     long long ans=0;
  48.  
  49.     for(i=all.size()-1;i>=0;i--){
  50.         long long t=0;
  51.         int nd=all[i].s,val=all[i].f;
  52.         for(j=0;j<gr[nd].size();j++){
  53.             int to=gr[nd][j];
  54.             if(!vis[to])continue;
  55.             int now=root(nd);
  56.             to=root(to);
  57.             if(now==to)continue;
  58.             t+=(long long)(-par[now])*(-par[to]);
  59.             union_set(now,to);
  60.         }
  61.         t*=val;
  62.         ans+=t;
  63.         vis[nd]=1;
  64.     }
  65.     ans*=2;
  66.     printf("%.6f\n",(double)ans/((long long)n*(n-1)));
  67. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement