zoukankan      html  css  js  c++  java
  • LOJ10066

    LOJ10066 新的开始

    题目描述

    发展采矿业当然首先得有矿井,小 F 花了上次探险获得的千分之一的财富请人在岛上挖了 n 口矿井,但他似乎忘记考虑的矿井供电问题……

    为了保证电力的供应,小 F 想到了两种办法:

    1. 在这一口矿井上建立一个发电站,费用为 v(发电站的输出功率可以供给任意多个矿井)。
    2. 将这口矿井与另外的已经有电力供应的矿井之间建立电网,费用为 p。

    小 FF 希望身为「NewBe_One」计划首席工程师的你帮他想出一个保证所有矿井电力供应的最小花费。

    输入格式

    第一行一个整数 n,表示矿井总数。

    第 2n+1 行,每行一个整数,第 i 个数vi 表示在第i 口矿井上建立发电站的费用。

    接下来为一个n×n 的矩阵 pp,其中pi,j 表示在第 i 口矿井和第 j 口矿井之间建立电网的费用(数据保证有pi,j=pj,i,且 pi,i=0)。

    输出格式

    输出仅一个整数,表示让所有矿井获得充足电能的最小花费。

    样例

    样例输入

    4  
    5  
    4 
    4  
    3  
    0 2 2 2  
    2 0 3 3  
    2 3 0 4  
    2 3 4 0

    样例输出

    9

    样例解释

    小 FF 可以选择在 4 号矿井建立发电站然后把所有矿井都不其建立电网,总花费是3+2+2+2=9。

    数据范围与提示

    对于 30% 的数据:1n50;
    对于 100% 的数据:1n300,0vi,pi,j10^5。

    _______________________________________________________

    最小生成树,记得建立0号点,把0号点到其他点的边长设为建电站的花费。

    _______________________________________________________

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int maxn=305;
     4 struct edge
     5 {
     6     int u,v,w;
     7 }e[maxn*maxn];
     8 int n,js,cnt;
     9 long long ans;
    10 void addage(int u,int v,int w)
    11 {
    12     e[js].u=u;e[js].v=v;e[js++].w=w;
    13 }
    14 bool mycmp(edge a,edge b)
    15 {
    16     return a.w<b.w;
    17 }
    18 int fa[maxn];
    19 int find(int x)
    20 {
    21     if(x==fa[x])return x;
    22     return fa[x]=find(fa[x]);
    23 }
    24 int main()
    25 {
    26     scanf("%d",&n);
    27     for(int x,i=1;i<=n;++i)
    28     {
    29         scanf("%d",&x);
    30         addage(0,i,x);
    31     }
    32     for(int x,i=1;i<=n;++i)
    33     {
    34         for(int j=1;j<=n;++j)
    35         {
    36             scanf("%d",&x);
    37             if(i<j)addage(i,j,x);
    38         }
    39     }
    40     for(int i=0;i<=n;++i)fa[i]=i;
    41     sort(e,e+js,mycmp);
    42     for(int i=0;i<js;++i)
    43     {
    44         int a=find(e[i].u),b=find(e[i].v);
    45         if(a!=b)
    46         {
    47             fa[a]=b;
    48             ans+=e[i].w;
    49             ++cnt;
    50             if(cnt==n)break;
    51         }
    52     }
    53     cout<<ans;
    54     return 0;
    55 }
    View Code
  • 相关阅读:
    12个非常不错的javascript类库
    CSS中单位em和rem的区别
    CSS中box-sizing属性的作用
    网页设计中的默认字体样式详解
    jQuery遍历Table表格的行和列
    css常用解决方案
    JS判断字符串小括号是否成对合法
    Less编码规范
    React九宫格抽奖
    n个有序数组,取出k个最大值
  • 原文地址:https://www.cnblogs.com/gryzy/p/10488191.html
Copyright © 2011-2022 走看看