zoukankan      html  css  js  c++  java
  • 【Vijos-P1579】宿命的PSS-逆向Kruskal

    测试地址

    题目大意:给定一棵最小生成树,求以它为唯一的最小生成树的完全图(每两点之间都直接有边相连的图)的最小边权之和。

    做法:首先把最小生成树中的边按边权从小到大排序,依次枚举每条边,根据Kruskal的求最小生成树思路可知,加入这条边前两点属于不同的集合,而这条边又一定是连接这两个集合的边中边权最小的(因为这是唯一的最小生成树),于是要构成满足条件的最小完全图,需要在两个集合之间连上(第一个顶点所在集合的点数*第二个顶点所在集合的点数-1)条边权为(当前边边权+1)的边,并把这些边权加入到答案中。然后只需要在并查集的合并操作中顺便维护集合内的点数即可。

    以下是本人代码:

    #include <cstdio>
    #include <cstdlib>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    long n,a[20010]={0},b[20010]={0},c[20010]={0};
    long f[20010]={0};
    long long num[20010]={0},ans;
    
    long find(long x)
    {
      long r=x,i=x,j;
      while(f[r]!=r) r=f[r];
      while(i!=r) {j=f[i];f[i]=r;i=j;}
      return r;
    }
    
    void merge(long a,long b)
    {
      long fa=find(a),fb=find(b);
      f[fa]=fb;
      num[fb]+=num[fa];
    }
    
    void quicksort(long l,long r)
    {
      if (l>=r) return;
      long mid=c[(l+r)/2];
      long i=l,j=r;
      while(i<=j)
      {
        while(c[i]<mid) i++;
    	while(c[j]>mid) j--;
    	if (i<=j)
    	{
    	  long temp;
    	  temp=c[i];c[i]=c[j];c[j]=temp;
    	  temp=a[i];a[i]=a[j];a[j]=temp;
    	  temp=b[i];b[i]=b[j];b[j]=temp;
    	  i++;j--;
    	}
      }
      quicksort(l,j);
      quicksort(i,r);
    }
    
    void input()
    {
      scanf("%ld",&n);
      for(int i=1;i<=n-1;i++)
      {
    	scanf("%ld %ld %ld",&a[i],&b[i],&c[i]);
        ans+=c[i];
      }
      for(int i=1;i<=n;i++)
      {
        f[i]=i;
    	num[i]=1;
      }
    }
    
    void work()
    {
      for(int i=1;i<=n-1;i++)
      {
        long fa=find(a[i]),fb=find(b[i]);
    	ans+=(num[fa]*num[fb]-1)*(c[i]+1);
    	merge(a[i],b[i]);
      }
    }
    
    void output()
    {
      printf("%I64d",ans);
    }
    
    int main()
    {
      input();
      quicksort(1,n-1);
      work();
      output();
      
      return 0;
    }


  • 相关阅读:
    hdu 1455 N个短木棒 拼成长度相等的几根长木棒 (DFS)
    hdu 1181 以b开头m结尾的咒语 (DFS)
    hdu 1258 从n个数中找和为t的组合 (DFS)
    hdu 4707 仓鼠 记录深度 (BFS)
    LightOJ 1140 How Many Zeroes? (数位DP)
    HDU 3709 Balanced Number (数位DP)
    HDU 3652 B-number (数位DP)
    HDU 5900 QSC and Master (区间DP)
    HDU 5901 Count primes (模板题)
    CodeForces 712C Memory and De-Evolution (贪心+暴力)
  • 原文地址:https://www.cnblogs.com/Maxwei-wzj/p/9793929.html
Copyright © 2011-2022 走看看