有向图的最短路径算法

有向图的最短路径算法----使用Dijkstra算法

此示例中是基于邻接矩阵的实现

要求输入:每个节点到其他节点的直接距离
要求输出:源点到其他节点 的最短距离

public int[] dijkstra(int[][] weight) {
		//源点到每个点的距离
		int[] dis = weight[0];
		//存储点的状态,是否已经访问
		boolean[] sta = new boolean[weight[0].length];
		//设置为真表示源点已经访问
		sta[0] = true;
		//根据现实情况把用户输入的值中的-1(表示不能直接到达)换成最大值
		//可根据具体要求进行部分改动
		for(int i=0; i<weight.length; i++) {
			for(int j=0; j<weight[0].length; j++) {
				if(weight[i][j] == -1)
					weight[i][j] = Integer.MAX_VALUE;
			}
		}
		//从第二个点开始访问
		for(int i=1; i<weight[0].length; i++) {
			int min = Integer.MAX_VALUE;
			//存储没有访问的距离最小值的下标
			int index = -1;
			//获取下标和最小值
			for(int j=1; j<weight[0].length; j++) {
				if(sta[j] == false) {
					if(dis[j] < min) {
						index = j; 
						min = dis[j];
					}
				}
			}
			if(index != -1) {  //找到最小的,状态标记为true,已访问
				sta[index] = true;
			}else {         //
				continue;
			}
			//找到的最短路径节点的可使用边中,判断是否比比已经存在的最短路径短,是则进行替换
			for(int l=1; l<weight[0].length; l++) {
				if(sta[l] == false) {    //查看未被访问的节点a
					//判断当前节点到节点a的最短距离,如果当前节点可直接到达节点a(设距离为dist),
					//并且min+dist1小于源点到节点a的距离dis,则替换dis为dist
					if(weight[index][l] != Integer.MAX_VALUE   
							&& (min + weight[index][l] < dis[l])) {
						dis[l] = min + weight[index][l];
					}
					//否则,啥也不干
				}
			}
		}
		return dis;
	}
}

测试有向图:

在这里插入图片描述

数据表示:
测试数据
输出结果:
输出结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值