zoukankan      html  css  js  c++  java
  • HDU-4750 Count The Pairs 最小生成树,并查集

      题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4750

      题意:Q个询问t,求在一个无向图上有多少对点(i,j)满足 i 到 j 的所有路径上的最长边的最小值大于等于t。

      (i,j)所有路径上的最长边的最小值,容易想到就是 i, j之间的瓶颈路,瓶颈路也就是最小生成树上的边了。注意到每条边的权值都是不相等的,那么MST就是确定的。假设当前MST的边的权值是f[i],Kruskal的并查集中维护一个cnt[i],表示以节点 i 为根的集合的节点个数,那么两个集合x和y合并,点对数就增加cnt[fa[x]]*cnt[fa[y]]*2,sum为点对数的累计和。那么询问t小于等于下一个MST中的边f[i+1]的值就是n*(n-1)*2-sum,把询问排序就可以了。。

      1 //STATUS:C++_AC_2593MS_7388KB
      2 #include <functional>
      3 #include <algorithm>
      4 #include <iostream>
      5 //#include <ext/rope>
      6 #include <fstream>
      7 #include <sstream>
      8 #include <iomanip>
      9 #include <numeric>
     10 #include <cstring>
     11 #include <cassert>
     12 #include <cstdio>
     13 #include <string>
     14 #include <vector>
     15 #include <bitset>
     16 #include <queue>
     17 #include <stack>
     18 #include <cmath>
     19 #include <ctime>
     20 #include <list>
     21 #include <set>
     22 #include <map>
     23 using namespace std;
     24 //#pragma comment(linker,"/STACK:102400000,102400000")
     25 //using namespace __gnu_cxx;
     26 //define
     27 #define pii pair<int,int>
     28 #define mem(a,b) memset(a,b,sizeof(a))
     29 #define lson l,mid,rt<<1
     30 #define rson mid+1,r,rt<<1|1
     31 #define PI acos(-1.0)
     32 //typedef
     33 typedef __int64 LL;
     34 typedef unsigned __int64 ULL;
     35 //const
     36 const int N=100010;
     37 const int INF=0x3f3f3f3f;
     38 const int MOD=100000,STA=8000010;
     39 const LL LNF=1LL<<60;
     40 const double EPS=1e-8;
     41 const double OO=1e15;
     42 const int dx[4]={-1,0,1,0};
     43 const int dy[4]={0,1,0,-1};
     44 const int day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
     45 //Daily Use ...
     46 inline int sign(double x){return (x>EPS)-(x<-EPS);}
     47 template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;}
     48 template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}
     49 template<class T> inline T lcm(T a,T b,T d){return a/d*b;}
     50 template<class T> inline T Min(T a,T b){return a<b?a:b;}
     51 template<class T> inline T Max(T a,T b){return a>b?a:b;}
     52 template<class T> inline T Min(T a,T b,T c){return min(min(a, b),c);}
     53 template<class T> inline T Max(T a,T b,T c){return max(max(a, b),c);}
     54 template<class T> inline T Min(T a,T b,T c,T d){return min(min(a, b),min(c,d));}
     55 template<class T> inline T Max(T a,T b,T c,T d){return max(max(a, b),max(c,d));}
     56 //End
     57 
     58 struct Edge{
     59     int u,v,w;
     60     bool operator < (const Edge& a)const {
     61         return w<a.w;
     62     }
     63 }e[N*5];
     64 struct Qu{
     65     int t,id;
     66     bool operator < (const Qu& a)const {
     67         return t<a.t;
     68     }
     69 }q[N];
     70 
     71 int fa[N],cnt[N],ans[N];
     72 int n,m,Q;
     73 
     74 int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
     75 
     76 int main(){
     77  //   freopen("in.txt","r",stdin);
     78     int i,j,k,x,y,t;
     79     while(~scanf("%d%d",&n,&m))
     80     {
     81         for(i=0;i<m;i++){
     82             scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
     83         }
     84         scanf("%d",&Q);
     85         for(i=0;i<Q;i++){
     86             scanf("%d",&q[i].t);
     87             q[i].id=i;
     88         }
     89 
     90         sort(e,e+m);
     91         sort(q,q+Q);
     92         for(i=0;i<n;i++)fa[i]=i,cnt[i]=1;
     93         for(i=t=j=0,k=1;i<m && k<n;i++){
     94             x=find(e[i].u),y=find(e[i].v);
     95             if(x==y)continue;
     96             for(;j<Q && q[j].t<=e[i].w;j++)ans[q[j].id]=n*(n-1)-t;
     97             t+=cnt[x]*cnt[y]*2;
     98             fa[x]=y;
     99             cnt[y]+=cnt[x];
    100             k++;
    101         }
    102         for(;j<Q;j++)ans[q[j].id]=n*(n-1)-t;
    103 
    104         for(i=0;i<Q;i++){
    105             printf("%d
    ",ans[i]);
    106         }
    107     }
    108     return 0;
    109 }
  • 相关阅读:
    每日一题 为了工作 2020 0412 第四十一题
    每日一题 为了工作 2020 04011 第四十题
    每日一题 为了工作 2020 0410 第三十九题
    每日一题 为了工作 2020 0409 第三十八题
    每日一题 为了工作 2020 0408 第三十七题
    每日一题 为了工作 2020 0407 第三十六题
    每日一题 为了工作 2020 0406 第三十五题
    每日一题 为了工作 2020 0405 第三十四题
    学习总结(二十四)
    学习总结(二十三)
  • 原文地址:https://www.cnblogs.com/zhsl/p/3344037.html
Copyright © 2011-2022 走看看