2016huasacm暑假集训训练三 F - Jungle Roads

本文通过一道关于重建岛屿间桥梁的编程题目,介绍了如何使用Prim算法解决最小生成树问题,并提供了一个具体的Java实现示例。

题目链接: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 }

 

转载于:https://www.cnblogs.com/LIUWEI123/p/5718942.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值