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 }

 

posted @ 2015-05-17 23:32  杨永华  阅读(173)  评论(0编辑  收藏  举报