zoukankan      html  css  js  c++  java
  • nyoj-38-布线问题

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<algorithm>
     4 #include<math.h>
     5 using namespace std;
     6 struct build
     7 {
     8     int b,e,num;
     9 }bu[125000];
    10 bool cmp(build a,build b)
    11 {
    12     return a.num<b.num;
    13 }
    14 int p[510];
    15 int find(int n)
    16 {
    17     return p[n]==n?n:p[n]=find(p[n]);
    18 }
    19 int kruskal(int m)
    20 {
    21     int sum=0,i;
    22     for(i=0;i<510;i++)
    23         p[i]=i;
    24     sort(bu,bu+m,cmp);
    25     for(i=0;i<m;i++)
    26     {
    27         int x,y; x=find(bu[i].b);y=find(bu[i].e);
    28         if(x!=y)
    29         {
    30             sum+=bu[i].num;
    31             p[x]=y;
    32         }
    33     }
    34     return sum;
    35 }
    36 
    37 int main()
    38 {
    39     int n,v,e,i,a;
    40     scanf("%d",&n);
    41     while(n--)
    42     {
    43         scanf("%d%d",&v,&e);
    44         for(i=0;i<e;i++)
    45         scanf("%d%d%d",&bu[i].b,&bu[i].e,&bu[i].num);
    46         int min=7634634;
    47         for(i=0;i<v;i++)
    48         {
    49             scanf("%d",&a);
    50             if(a<min)
    51             min=a;
    52         }
    53         printf("%d
    ",min+kruskal(e));
    54     }
    55     return 0;
    56 }

    布线问题  思路 并查集   初始每个城市是一个集合  然后从距离最短的找 不属于一个集合  那么就合并为一个集合   最后的集合就是整个线路了 

  • 相关阅读:
    oracle性能调优
    oracle常用函数
    plsql的安装与使用
    WSAIoctl
    SQL中大概有这么几种JOIN
    如何取分组最大值记录
    having
    MSSQL—按照某一列分组后取前N条记录
    sql之left join、right join、inner join的区别
    delphi 接收心跳包怎么写
  • 原文地址:https://www.cnblogs.com/nylg-haozi/p/3202603.html
Copyright © 2011-2022 走看看