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)); } } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理