• 2016huasacm暑假集训训练三 F


    题目链接:https://vjudge.net/contest/123674#problem/F

    题意:在相通n个岛屿的所有桥都坏了,要重修,重修每一个桥所用的时间不同,求重修使每个岛屿都间接或直接与其他岛屿相同时所用的的最短时间  这就是一个简单的最小生成树的模板题,只要用了prime算法模板,但题是给出点的字母名,可以先转化为数字,在建立数组,就很容易写出来AC:

     1 import java.io.BufferedInputStream;
     2 import java.util.Scanner;
     3 
     4 public class Main {
     5     final static int N = 1 << 20;
     6     static int n, m, a[][] = new int[105][105], b[] = new int[105], sum;
     7 
     8     public static void main(String[] args) {
     9         Scanner s = new Scanner(new BufferedInputStream(System.in));
    10         int i, j, t, w;
    11         String u, v;
    12         while (s.hasNext()) {
    13             n = s.nextInt();
    14             if (n == 0)
    15                 break;
    16 
    17             for (i = 1; i <= n; i++)
    18                 for (j = 1; j <= n; j++)
    19                     a[i][j] = N;
    20             m = n - 1;
    21             while (m-- > 0) {
    22                 u = s.next();
    23                 t = s.nextInt();
    24                 while (t-- > 0) {
    25                     v = s.next();
    26                     w = s.nextInt();
    27                     i = (u.charAt(0) - 'A') + 1;
    28                     j = (v.charAt(0) - 'A') + 1;
    29                     a[i][j] = w;
    30                     a[j][i] = w;
    31                 }
    32             }
    33              
    34             sum = 0;
    35             prim(1);
    36             System.out.println(sum);
    37         }
    38         s.close();
    39     }
    40 
    41     static void prim(int u) {
    42         int i, j, min, v;
    43         for (i = 1; i <= n; i++) {
    44             b[i] = a[u][i];
    45          
    46         }
    47         sum = 0;
    48         b[u] = -1;
    49         for (i = 1; i <= n; i++) {
    50             min = N;
    51             v = -1;
    52             for (j = 1; j <= n; j++) {
    53                 if (b[j] >0 && b[j] < min) {
    54                     v = j;
    55                     min = b[j];
    56                 }
    57             }
    58             if (v != -1) {
    59                 sum += b[v];
    60              
    61                 b[v] = -1;
    62                 for (j = 1; j <= n; j++) {
    63                     if (b[j] != -1 && a[v][j] < b[j])
    64                         b[j] = a[v][j];
    65                 }
    66             }
    67         }
    68 
    69     }
    70 
    71 }
  • 相关阅读:
    iqueryable lambda表达式
    win10安装后耳机有声音而外放无声音
    Coursera机器学习week11 笔记
    Coursera机器学习week10 单元测试
    Coursera机器学习week10 笔记
    Coursera机器学习week9 编程作业
    Coursera机器学习week9 单元测试
    Coursera机器学习week9 笔记
    Coursera机器学习week8 编程作业
    Coursera机器学习week8 单元测试
  • 原文地址:https://www.cnblogs.com/LIUWEI123/p/5718942.html
Copyright © 2020-2023  润新知