poj 1251
题意:就是求最小生成树的边权值和
prim算法求最小生成树
1 import java.util.Scanner; 2 import java.util.Arrays; 3 /* 4 prim 5 */ 6 public class Main{ 7 static int map[][]; //存储邻接矩阵 8 static boolean visit[]; //标记加入的结点 9 static int n; 10 static int INF = 0x3f3f3f3f; 11 12 public static int prim(){ 13 int sum=0; 14 visit = new boolean[n]; 15 visit[0] = true; 16 17 for(int i=0;i<n-1;i++){ //n个结点需要n-1条边,循环n-1次 18 int min = INF; 19 int u = 0; //保存下一个要加入树的结点下标 20 for(int j=1;j<n;j++){ 21 if(visit[j]==false&&map[0][j]<min){ 22 min = map[0][j]; 23 u = j; 24 } 25 } 26 visit[u] = true; //将结点加入,标记置为true 27 sum+=min; 28 for(int j=1;j<n;j++){ //更新数据 29 if(visit[j]==false&&map[u][j]<map[0][j]) 30 map[0][j] = map[u][j]; 31 } 32 } 33 return sum; 34 } 35 36 public static void main(String[] args){ 37 Scanner in = new Scanner(System.in); 38 while(in.hasNext()){ 39 n = in.nextInt(); 40 if(n==0) 41 break; 42 map = new int[n][n]; 43 for(int i=0;i<n;i++) 44 Arrays.fill(map[i],INF); 45 for(int i=0;i<n-1;i++){ 46 char chx = in.next().charAt(0); 47 int j = in.nextInt(); 48 while(j!=0){ 49 j--; 50 char chy = in.next().charAt(0); 51 int y = chy - 'A'; 52 int cost = in.nextInt(); 53 map[i][y] = map[y][i] = cost; 54 } 55 } 56 System.out.println(prim()); 57 } 58 } 59 }
Kruskal算法求最小生成树
1 import java.util.Scanner; 2 import java.util.Collections; 3 import java.util.Iterator; 4 import java.util.LinkedList; 5 import java.util.List; 6 /* 7 kruskal 8 */ 9 public class Main{ 10 static int n; 11 static int parent[]; 12 13 public static int find(int x){ //查找父节点 14 return parent[x]==x?x:(parent[x] = find(parent[x])); 15 } 16 17 public static void join(int x,int y){ //将两个并查集并在一起 18 parent[x] = y; 19 } 20 21 public static int kruskal(List<Edge> list){ 22 int sum = 0; 23 Iterator<Edge> it = list.iterator(); 24 while(it.hasNext()){ 25 Edge edge = it.next(); 26 if(find(edge.s)==find(edge.e)) //如果父节点相同说明在同一个并查集中,若取这条边则会形成环 27 continue; 28 sum+=edge.length; 29 join(find(edge.s),find(edge.e)); //如果父节点不相同,则取这条边,并将两个结点所在并查集合并 30 } 31 return sum; 32 } 33 34 public static void main(String[] args){ 35 Scanner in = new Scanner(System.in); 36 while(in.hasNext()){ 37 n = in.nextInt(); 38 if(n==0) 39 break; 40 parent = new int[n]; 41 for(int i=0;i<n;i++) 42 parent[i] = i; 43 List<Edge> list = new LinkedList<Edge>(); 44 for(int i=0;i<n-1;i++){ 45 char chx = in.next().charAt(0); 46 int j = in.nextInt(); 47 while(j!=0){ 48 j--; 49 char chy = in.next().charAt(0); 50 int y = chy - 'A'; 51 int cost = in.nextInt(); 52 list.add(new Edge(i,y,cost)); //将边加入list中 53 } 54 } 55 Collections.sort(list); //按边权值大小进行排序 56 System.out.println(kruskal(list)); 57 } 58 } 59 } 60 61 class Edge implements Comparable<Edge>{ //继承Comparable接口 62 public int length; 63 public int s; 64 public int e; 65 66 public Edge(int s,int e,int length){ 67 this.s = s; 68 this.e = e; 69 this.length = length; 70 } 71 72 public int compareTo(Edge o){ //重写compareTo函数,使边按权值大小升序排序 73 return this.length-o.length; 74 } 75 }