• Bzoj1083 1083: [SCOI2005]繁忙的都市【MST】


    大水题,真不知道出题者是怎么把这么水的题出的这么长的TAT 其实这题在于考语文水平,一共三个要求,前两个要求意思就是要选出的道路是树形的,最后一个要求就是要权值最小,于是整个题意说白了就是求一棵MST,以前向星的形式给出最容易想到kruskal算法,于是这题顺利结束,从看题一直到调试结束半个小时搞定……

    #include<iostream>

    #include<cstdio>

    #include <math.h>

    using namespace std;

    intfather[4000]={0},a[5000]={0},b[5000]={0},v[5000]={0};

    void qsort(int l,int r)

    {

        int mid=v[(l+r)>>1],i=l,j=r,temp;

        while (i<j)

         {

              while (v[i]<mid)i++;

              while (v[j]>mid)j--;

              if (i<=j)

              {

                      temp=a[i];a[i]=a[j];a[j]=temp;

                      temp=b[i];b[i]=b[j];b[j]=temp;

                      temp=v[i];v[i]=v[j];v[j]=temp;

                       i++;j--;

              }

         }

        if (i<r)qsort(i,r);

        if (l<j)qsort(l,j);

    }

    int find(int k)

    {

        if(father[k]==k)return k;else return father[k]=find(father[k]);

    }

    int main()

    {

       int n,m,t=0,ans;

       scanf("%d%d",&n,&m);

       for (inti=1;i<=m;i++)scanf("%d%d%d",&a[i],&b[i],&v[i]);

       for (int i=1;i<=n;i++)father[i]=i;

       qsort(1,m);

        

       for (int i=1;i<=m;i++)

        {

           if (find(a[i])!=find(b[i]))

           {

               father[find(a[i])]=father[find(b[i])];//合并

               t++;

               if (t==n-1)ans=v[i];

           }

        }

       printf("%d %d ",t,ans);

       return 0;

    }

  • 相关阅读:
    一些经验
    倍增(在线)求LCA
    IDA*算法——骑士精神
    A*算法——第K短路
    (持续更新)一些黑科技和技巧
    逆元
    方便人类——信息学训练专用库
    PHP单点登陆
    PHP 中运用 elasticsearch
    PHP斐波那契数列
  • 原文地址:https://www.cnblogs.com/philippica/p/4006939.html
Copyright © 2020-2023  润新知