Kruskal 最小生成树(输出最小生成树的路径,权值的和) 参考poj 1258
2012-06-15 17:39
405 查看
输入无向图的,矩阵存储格式,
package com.liang.poj; import java.util.Scanner; public class Test2485Kruskal { static int n = 0; static int[][] cin = null; static boolean[] visited = null; //对顶点进行标记 static int[][] brimCollection = null; //边的集合 static int index = 0; static int[] path = null; //记录路径和路径边上的权值 static int pathIndex = 0; public static void main(String[] args) { Scanner scan = new Scanner(System.in); while (scan.hasNext()) { n = scan.nextInt(); cin = new int ; visited = new boolean ; brimCollection = new int[n * n - n][3]; path = new int[n - 1]; for (int i = 0; i < cin.length; i++) { // 初始化cin brimCollection for (int j = 0; j < cin[i].length; j++) { cin[i][j] = scan.nextInt(); if (cin[i][j] != 0) { brimCollection[index][0] = i; brimCollection[index][1] = j; brimCollection[index++][2] = cin[i][j]; } } } sort(); path[pathIndex++] = 0; visited[brimCollection[0][0]] = true; visited[brimCollection[0][1]] = true; kruskal(); for(int i=0; i<path.length; i++) { //对路径和权值进行输出 System.out.print(brimCollection[path[i]][0] + " "); System.out.print(brimCollection[path[i]][1] + " "); System.out.println(); } int sum = 0; for(int i=0; i<path.length; i++) { sum += brimCollection[path[i]][2]; } System.out.println(sum); //输出最小生成树,权值的和 } } public static void kruskal() { //克鲁斯卡尔算法 int count = 1; for (int i = 1; i < brimCollection.length; i++) { int a = brimCollection[i][0]; int b = brimCollection[i][1]; if ((!visited[a] && visited[b]) || (visited[a] && !visited[b])) { visited[a] = true; visited[b] = true; path[pathIndex++] = i; i = 0; count ++ ; } if(count == n) { break; } } } public static void sort() { //对所有的边按权值进行排序 for (int i = 0; i < brimCollection.length; i++) { if (brimCollection[i][2] == 0) { break; } for (int j = i + 1; j < brimCollection.length; j++) { if (brimCollection[j][2] == 0) { break; } if (brimCollection[i][2] > brimCollection[j][2]) { exchange(i, j, 0); exchange(i, j, 1); exchange(i, j, 2); } } } } public static void exchange(int i, int j, int cos) { int x = 0; x = brimCollection[i][cos]; brimCollection[i][cos] = brimCollection[j][cos]; brimCollection[j][cos] = x; } }
相关文章推荐
- poj 1751 (最小生成树 Prime+kruskal 路径输出)
- poj 1258 Agri-Net dijkstra迪杰斯特拉算法,最短路径问题的变形,最小生成树
- POJ 1258 Agri-Net(最小生成树 Kruskal)
- poj 1258 小白算法练习 Agri-Net 最小生成树 prim kruskal
- poj 1258 Agri-Net 【最小生成树-Kruskal】
- 最小生成树之Kruskal---POJ1258---Agri-Net
- POJ 1258 Agri-Net (kruskal求最小生成树)
- POJ 1258--Agri-Net【最小生成树 && Kruskal && 水题】
- POJ 1258 Agri-Net 最小生成树 prim && kruskal
- 文章标题 POJ 1258 : Agri-Net(最小生成树--kruskal)
- 最小生成树模板(POJ 1258-prime+HDU 1233 Kruskal为例)
- Poj 1258 Agri-Net(最小生成树 kruskal)
- POJ 1258(最小生成树之Kruskal)
- poj 1258(最小生成树 Kruskal)
- poj-1258-最小生成树kruskal模板
- poj 1258 Agri-Net 最小生成树 kruskal
- poj 1258 Agri-Net 最小生成树 kruskal
- POJ 1751 Highways【最小生成树+输出路径】
- POJ 1258 Agri-Net(最小生成树 Prim+Kruskal)
- poj1258 - Agri-Net (经典邻接矩阵 求最小生成树) (Prim & Kruskal)