POJ 1789 Truck History的Prim算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
package pro.proclass.chaopengfan;
 
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
 
public class VjudgeH {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        while (br.ready()) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int n = Integer.parseInt(st.nextToken());
            if(n==0)break;
            String[] data = new String[n];
            int[][] map = new int[n][n]; //所有卡车相互转换所需要的衍生距离
 
            for (int i = 0; i < n; i++) {
                st = new StringTokenizer(br.readLine());
                data[i] = st.nextToken();
            }
 
            // 初始化所有卡车之间的距离
            for(int i = 0; i < n; i++) {
                for(int j = 0; j < n; j++) {
                    if(i==j)continue; // 卡车自己不需要衍生
                    int dis = 0;
 
                    // 计算卡车i和卡车j之间不同的字母位置个数
                    for (int k = 0; k < 7; k++) {
                        if(data[i].charAt(k) != data[j].charAt(k))
                            dis++;
                    }
 
                    map[i][j] = dis;
                }
            }
 
            int ans = 0;
            // 开始prim算法
            int[] distance = new int[n]; // 存储到点i的最短距离的边权值。
            //开始随便从一个点开始。我这里从0点走
            // 初始化distance
            for (int i = 0; i < n; i++) {
                distance[i] = map[0][i]; // 0点到其他所有点的距离
            }
 
            boolean[] visited = new boolean[n]; //存储哪些点的最短权边已经找到
            visited[0] = true; // 从0点开始走,不需要找
 
            for (int i = 0; i < n; i++) { // 最多可能需要找n-1次最短距离边
                int node = -1;
                int min = Integer.MAX_VALUE;
                for (int j = 0; j < n; j++) { // 查找distance最短边点的权值
                    if(distance[j] < min && !visited[j]) {
                        min = distance[j];
                        node = j;
                    }
                }
 
                if(min == Integer.MAX_VALUE) break;
                visited[node] = true;
                ans += min;
 
                for (int j = 0; j < n; j++) {
                    // 寻找结束点node对应边的权值,存储较小的权
                    if(!visited[j] && distance[j] > map[node][j]) {
                        distance[j] = map[node][j];
                    }
                }
            }
 
            System.out.println(String.format("The highest possible quality is 1/%d.", ans));
        }
    }
}

  

posted @   姓蜀名黍  阅读(116)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示