JAVA最短路径(2)warshell 和 bellman

7 篇文章 0 订阅
package shortest;

public class Solution {
	//warshell o(n^3)
	/*public static void main(String args[]) {
	int [][] rou=new int[10][10] ;
	int n=3;//假设顶点个数3个,这里偷懒直接写有3个就不键盘输入了
	int inf=10000;//假设为无限大的数
	//初始化
for(int i=1;i<=n;i++) {
	for(int j=1;j<=n;j++) {
		rou[i][j]=inf;
		if(i==j)
			rou[i][i]=0;
	}
}
//这里咱们假设三个顶点三条边,这里偷懒直接写就不键盘输入了
//rou[1][2]=6表示1->2距离6以此类推
rou[1][2]=6;
rou[2][3]=8;
rou[1][3]=7;
for(int i=1;i<=n;i++) {
	for(int j=1;j<=n;j++) {
		System.out.printf("%d ",rou[i][j]);
	}
	System.out.println( );
	}
System.out.println( );
//之前用c语言写过这个代码,思路就是首先不看k这一层,ij层就是如果rou[i][j]小就更新
 //k这一层循环代表每次更新一个新的结点k使得rou[i][j]可以比较
for(int k=1;k<=n;k++) {
	for(int i=1;i<=n;i++) {
		for(int j=1;j<=n;j++) {
			if(rou[i][j]>rou[i][k]+rou[k][j]) {
				rou[i][j]=rou[i][k]+rou[k][j];
			}
		}
	}
}
for(int i=1;i<=n;i++) {
	for(int j=1;j<=n;j++) {
		System.out.printf("%d ",rou[i][j]);
	}
	System.out.println( );
	}
	}
	*/
	//执行上述代码的时候发现至少有一个可以改进的地方就是首先作为起始点rou[i][j]的i能不能恒为1,
	//也就说只从这个源点1和其他各点进行比较,更新最短路径,其次能不能降维成一维数组
	//接下来的改进就是著名的迪杰斯特拉算法和bellman解决负权变
//首先介绍bellman算法,查阅资料可以得出bellman
//输入顶点及边的权值,这里假设5顶点5条边,具体看mspaint上画的图
public static void main(String args[]) {
int[] dis=new int[10];
int[] u=new int[10];
int[] v=new int[10];
int[] w=new int[10];
int n=5,m=5;
//第一个结点2->3 权值2
	u[1]=2;v[1]=3;w[1]=2;
	u[2]=1;v[2]=2;w[2]=-3;
	u[3]=1;v[3]=5;w[3]=5;
	u[4]=4;v[4]=5;w[4]=2;
	u[5]=3;v[5]=4;w[5]=3;
	int inf=10000;
	for(int i=1;i<=n;i++) {
		dis[i]=inf;
	}
	dis[1]=0;
//核心代码o(m*n)
	for(int k=1;k<=n-1;k++)//去掉自己这个顶点
		for(int i=1;i<=m;i++)//内循环m条边,对每条边修改
			if(dis[v[i]]>dis[u[i]]+w[i])//顶点u[i]到顶点v[i]这条边权值为w[i]
				dis[v[i]]=dis[u[i]]+w[i];
//打印
	for(int i=1;i<=n;i++) {
	System.out.println(dis[i]);
}
}

}

 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值