BFS计算无向图的最短路径问题(普里姆算法prim)

无向图计算最短路径:
通过建立二维数组来表示两点之间是否可达,通过寻找连通分量,每次找到过一个点就将点放入到list集合中,并且当前连通量的个数减去一个,每次寻找的点都必须是到达list中最短的,并且当前连通量的个数减去一个,当连通量等于1的时候,那么list中的各个点的路径就是无向图的最短路径。

//无向图最小生成树
public class Prim {
    public static void main(String[] args) {
    	Prim p = new Prim();
		//记录连通量的个数
		int size = 6;
		//记录当前最大连通量的所含字母
		List<Integer> list = new ArrayList<>();
		//画出无向图并标明边权 
		int[][] arr = {
				{0,0,0,0,0,0,0},
				{0,-1,6,1,5,-1,-1},
				{0,6,-1,5,-1,3,-1},
				{0,1,5,-1,5,6,4},
				{0,5,-1,5,-1,-1,2},
				{0,-1,3,6,-1,-1,6},
				{0,-1,-1,4,2,6,-1}
		};
		int result = p.getAnswer(size,list,arr);
		System.out.println("最短连通长度为:"+result);
		}

	private  int getAnswer(int size, List<Integer> list, int[][] arr) {
        int answer = 0;
        int curLength = Integer.MAX_VALUE;
        int index1 = 0;
        int index2 = 0;
        //判断当前连通分量的数量
        while(size > 1) {
        for (int i = 1; i < arr.length; i++) {
        	//如果set 包含了当前连通量 跳到下一行
        	if(list.contains(i)) {
        		continue;
        	}
			for (int j = 1; j < arr[i].length; j++) {
				//说明两点之间不可达
				if(arr[i][j] < 0) {
					continue;
				}
				//list为空的时候代表第一次找最小权值
				//list不为空代表 需要找到与当前最大连通分量有连接的最小边权
				if((list.size() == 0 || list.contains(j)) && arr[i][j] < curLength){
					curLength = arr[i][j];
					index1 = i;
					index2 = j;
				}
			}
		} 
           list.add(index1);
           list.add(index2);           
           size--;
           answer += curLength;
           curLength = Integer.MAX_VALUE;
        }
		return answer;
	}
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值