图+邻接矩阵+最小生成树

/**
 * 文件名:AdjacencyMatrix.java
 * 所在包:Graph
 * 日期:2013-12-31 上午9:27:47
 * 版本信息:version V1.0
 * Copyright Corporation 2013
 * 版权所有: 
 *
 */  

package Graph;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;

/**
 *
 * 项目名称:jobdu
 * 类名称:AdjacencyMatrix
 * 类描述:邻接矩阵 = 顺序表(存储顶点信息) + 二维数组(表示顶点之间的邻接关系)
 * 创建人:黄传聪
 * 创建时间:2013-12-31 上午9:27:47
 * 修改人:
 * 修改时间:
 * 修改备注:
 * @version
 */
public class AdjacencyMatrix {

	/** 顶点数量   */
	private int n;
	/** 顶点数组   */    
	private int[] vertexes;
	/** 二维数组,表示顶点之间的邻接关系 0表示无关系  */    
	private int[][] matrix;
	/**  是否是无向图:true ;有向图:false  */    
	private boolean flag ;
	//各个节点的父节点
	private int[] fathers ;
	public AdjacencyMatrix() {
		//默认为10
		this(10,true);
		
	}
	public AdjacencyMatrix(int n, boolean flag) {
		this.n = n;
		this.flag = flag;
		vertexes = new int[n];
		matrix = new int[n][n];
		for(int i=0;i ");
		}*/
		
		adjacencyMatrix.kruscal();

	}

	
	/**
	 * 方法名称:prim()
	 * 方法描述:最小生成树,prim 算法实现:对顶点进行遍历,适用于稠密图,时间复杂度o(n*n)
	 * @param  begin: 开始遍历的节点
	 * 测试数据:
	 * 1 2 3 4 5 6
		1 2 6
		1 3 1
		1 4 5
		2 5 3
		2 3 5
		3 4 5
		3 5 6 
		3 6 4 
		4 6 2
		5 6 6
		0 0 0
	 * @return String    
	 * @Exception 
	 */
	public int[] prim(int begin){
		int index = 0;
		//结果
		int[] result = new int[n];
		/*两个顶点之间的最小距离*/
		int[] lowCost = new int[n];
		/*记录顶点是否被选中, 默认为未选中*/
		int[] closet = new int[n];
		//标记节点选中
		closet[begin] = 1;
		result[index++] = begin;
		for(int i=0;i matrix[k][l]&& lowCost[l] != 0){
					lowCost[l] = matrix[k][l];
				}
			}
			
		}
		return result;
	}
	
	public void prim(){
		int[] lowCost = new int[n];
		int[] closeSet = new int[n];
		
		int i ,j, k, min;
		
		for(i=1;i edges = new ArrayList();
		//构建list
		//如果是无向图,只需构建一侧
		//无向图
		Edge edge = null;
		if(flag){
			
			for(int i=0;i() {

			@Override
			public int compare(Edge e1, Edge e2) {
				// TODO Auto-generated method stub
				if(e1.weight - e2.weight > 0){
					return 1;
				}else if(e1.weight - e2.weight < 0){
					return -1;
				}else{
					return 0;
				}
			}
		});
		
		//对每条边的两个顶点设置父顶点
		for(Edge e : edges){
			
			int a = getFather(e.from);
			int b = getFather(e.end);
			if(a != b){
				fathers[b] = a;
				System.out.println((e.from+1) + " -> " + (1+e.end));
			}
		}
		
	}
	
	private int getFather(int x){
		return (x == fathers[x]) ? x : (fathers[x]=getFather(fathers[x]));
	}
}



转载于:https://my.oschina.net/u/1011659/blog/193312

你可能感兴趣的:(图+邻接矩阵+最小生成树)