最小生成树-Kruskal和Prim-JAVA代码

1、Kruskal

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;

public class Kruskal {
	
    /** 
     * 求最小树的Kruskal算法 
     * 算法思想:克鲁斯卡尔算法从另一个途径求网中的最小生成树。假设联通网N=(V,{E}),则令最小
     * 生成树的初始状态为只有n个顶点而无边的非连通图T=(V,{}),途中每个顶点自称一个连通分量。 
     * 在E中选择代价最小的边,若该边依附的顶点落在T中不同的连通分量上,则将此边加入到T中,否则舍去此边 
     * 而选择下一条最小的边。以此类推,直至T中所有的顶点都在同一连通分量上为止。 
     * 1 2 3 4 5 6   //初始状态
     * (1 3) 2 4 5 6 //顶点13连通,(1 3)是不是连通分量
     * (1 3) (2 5) 4 6 //25连通
     * (1 2 3 5) 4 6 //35连通,则1 2 3 5整体连通,成为一个连通分量
     * (1 2 3 4 5 6)结束//两顶点若存在同一个连通分量上,则表示存在环,去除此边
     * @param V 图中的节点集合
     * @param E 图中边的集合 
     */  
	public static void KRUSKAL(int [] V,Edge [] E){  
        Arrays.sort(E);//将边按照权重w升序排序  
        ArrayList> sets=new ArrayList>();  
        for(int i=0;i set=new HashSet();  
            set.add(V[i]);  
            sets.add(set);            
        }  
        for(int i=0;i set=sets.get(j);  
                if(set.contains(start)){  
                    counti=j;  
                }  
                if(set.contains(end)){  
                    countj=j;  
                }  
            }  
            if(counti<0||countj<0) System.err.println("没有在子树中找到节点,错误");  
            if(counti!=countj){  
                System.out.println("输出start="+start+"||end="+end+"||w="+E[i].w);  
                HashSet setj=sets.get(countj);  
                sets.remove(countj);  
                HashSet seti=sets.get(counti);  
                sets.remove(counti);  
                seti.addAll(setj);  
                sets.add(seti);  
            }else{  
                System.out.println("他们在一棵子树中,不能输出start="+start+"||end="+end+"||w="+E[i].w);  
            }  
        }  
    }  
      
    public static void main(String [] args){  
  
        int [] V={1,2,3,4,5,6};  
        Edge [] E=new Edge[10];  
        E[0]=new Edge(1,2,6);  
        E[1]=new Edge(1,3,1);  
        E[2]=new Edge(1,4,5);  
        E[3]=new Edge(2,3,5);  
        E[4]=new Edge(2,5,3);  
        E[5]=new Edge(3,4,5);  
        E[6]=new Edge(3,5,6);  
        E[7]=new Edge(3,6,4);  
        E[8]=new Edge(4,6,2);  
        E[9]=new Edge(5,6,6);  
        Kruskal.KRUSKAL(V, E);  
    }  
  
}
class Edge implements Comparable {
	public int i, j, w;

	public Edge(int i, int j, int w) {
		this.i = i;
		this.j = j;
		this.w = w;
	}

	@Override
	public int compareTo(Object o) {
		Edge to = (Edge) o;
		if (this.w > to.w)
			return 1;
		else if (this.w == to.w)
			return 0;
		else
			return -1;

	}

	@Override
	public String toString() {
		return "start=" + i + "||end=" + j + "||w=" + w;
	}
}
 
  

2、Prim

import java.util.*;  
public class Prim {  
    static int MAX = Integer.MAX_VALUE;  
  
    public static void main(String[] args) {  
        int[][] map = new int[][] {  
                { 0, 10, MAX, MAX, MAX, 11, MAX, MAX, MAX },  
                { 10, 0, 18, MAX, MAX, MAX, 16, MAX, 12 },  
                { MAX, MAX, 0, 22, MAX, MAX, MAX, MAX, 8 },  
                { MAX, MAX, 22, 0, 20, MAX, MAX, 16, 21 },  
                { MAX, MAX, MAX, 20, 0, 26, MAX, 7, MAX },  
                { 11, MAX, MAX, MAX, 26, 0, 17, MAX, MAX },  
                { MAX, 16, MAX, MAX, MAX, 17, 0, 19, MAX },  
                { MAX, MAX, MAX, 16, 7, MAX, 19, 0, MAX },  
                { MAX, 12, 8, 21, MAX, MAX, MAX, MAX, 0 } };  
        prim(map, map.length);  
    }  
     public static void prim(int[][] graph, int n){  
              
            char[] c = new char[]{'A','B','C','D','E','F','G','E','F'};          
            int[] lowcost = new int[n];  //到新集合的最小权   
            int[] mid= new int[n];//存取前驱结点  
            List list=new ArrayList();//用来存储加入结点的顺序
            int i, j, min, minid , sum = 0;  
          //初始化辅助数组
            for(i=1;igraph[minid][j])  
                     {  
                         lowcost[j]=graph[minid][j];  
                         mid[j]=minid;  
                     }  
                 }  
            }  
            System.out.println("sum:" + sum);  
              
        }  
          
}  

 

你可能感兴趣的:(学习笔记)