无权图的最短路径

思路:无权图的最短路径也就是要求两点之间最少几跳可达,那么我们可以这样,用广度遍历,从起点开始一层层遍历,如果第一次遍历到终点,那么肯定是最短路径。

public static void findPath(int start,int end)

{

//创建一个队列来存储

LinkedList< VNode> queue=new LinkedList();

queue.offer(nodes[start]);

while(!queue.isEmpty())

{

VNode vnode=queue.peek();

isVisit[vnode.index]=true;

BNode bnode=vnode.bnode;

//如果结束点已经访问 跳出循环

if(isVisit[end])

break;

//如果他的邻节点都访问或者没有邻节点 跳出循环

while(bnode!=null)

{

//如果邻节点还没被访问访记录他的上一节点,否则不进行记录。这样的话即使到了下一跳有这个顶点,记录的也是更的短路径,比如说起点A 邻节点有BCD B的邻节点是C,此时遍历A的邻节点C的时候,就记录C的上一节点是A,下次遍历B的领节点,因为C已经被访问,所以C记录的上一节点还是A,这样就保证了最短路径。

if(!isVisit[bnode.index])

{

//用于记录路径

nodes[bnode.index].before=vnode;

queue.offer(nodes[bnode.index]);

isVisit[bnode.index]=true;

}

bnode=bnode.next;

}

queue.pop();

}

}

public static void printPath(int end)

{

VNode node=nodes[end];

int count=0;

String path="";

while(node!=null)

{

path=node.index+path;

node=node.before;

count++;

}

System.out.println(path+"长度为:"+(count-1));

}

Dijkstra求有权图最短路径

Dijkstra思路:依次找到最短路径,比如起点A,先找到距离A路径最短的点,比如B,AB路径长为1,这时候,接着往下找比大于等于1的最短路径。通俗讲就是小明很贪心,每一次都找挑最短路径。

import java.util.Scanner;

public class Dijkstra {

public static void main(String[] args) {

final int MAX=Integer.MAX_VALUE;

Scanner in=new Scanner(System.in);

int vNum=in.nextInt();

int edgeNum=in.nextInt();

//二维数值用来表示图

int graphic[][]=new int [vNum][vNum];

//flag[v][w]标识 从v0到v点 w是不是在路径上,用于记录路径

boolean [][] path=new boolean [vNum][vNum];

//标识是否访问过

boolean [] isVisit=new boolean[vNum];

//v0到各点的最短路径

int distance[]=new int [vNum];

//进行初始化,任意两个点的距离无限大

for (int i = 0; i

for (int j = 0; j < vNum; j++) {

graphic[i][j]=MAX;

}

}

//读取数据,设置权值

for (int i = 0; i < edgeNum; i++) {

graphic[in.nextInt()][in.nextInt()]=in.nextInt();

}

//起点

int v0=in.nextInt();

//结束点

int end=in.nextInt();

in.close();

//进行初始化

isVisit[v0]=true;

for (int i = 0; i < distance.length; i++) {

distance[i]=graphic[0][i];

if(graphic[v0][i]

{

path[i][i]=true;

path[i][v0]=true;

}

}

int v=-1;

//要找到vNum-1个顶点,循环次数为vNum-1

for (int i = 1; i < vNum; i++) {

int min=Integer.MAX_VALUE;

//遍历找到目前v0到其他点的最短距离的点,依次找到离起点最近的点

for (int j = 0; j < vNum; j++) {

if(!isVisit[j]&&distance[j]

{

min=distance[j];

v=j;

}

}

isVisit[v]=true;

//新的点v加入,重新更新从v0到其他点的最短距离

for (int k = 0; k < distance.length; k++) {

if(!isVisit[k]&&graphic[v][k]min+graphic[v][k])

{

distance[k]=min+graphic[v][k];

//当前的路径是从v到w,所以到v0到v的最短路径上的点也是v0到w上的点

System.arraycopy(path[v], 0, path[k], 0, path[v].length);

path[k][k]=true;

}

}

}

System.out.print("路径为:");

for (int i = 0; i < vNum; i++) {

if(path[end][i])

System.out.print(i+" ");

}

System.out.println("路径长为"+distance[end]);

}

}

测试数据:

6 8

0 4 30

0 2 10

0 5 100

1 2 5

2 3 50

4 5 60

4 3 20

3 5 10

0 3

输出:

路径为:0 3 4 路径长为50

Floyd算法求有权图最小路径

Floyd思路:floyd算法用的dp的思想,核心代码

for (int k = 0; k < vNum; k++) {

if(distance[i][j]>distance[i][k]+distance[k][j])

{

distance[i][j]=distance[i][k]+distance[k][j];

index=k;

}

}

求i到j的最短路径,通过遍历每一种情况,从i跳到k再有k跳到j,遍历每一个可能的k值,最后求得到最小路径。

import java.util.Scanner;

public class Floyd {

public static void main(String[] args) {

final int MAX=10000;

Scanner in=new Scanner(System.in);

int vNum=in.nextInt();

int edgeNum=in.nextInt();

//二维数值用来表示图

int distance[][]=new int[vNum][vNum];

int [][] path=new int [vNum][vNum];

//进行初始化,任意两个点的距离无限大

for (int i = 0; i

for (int j = 0; j < vNum; j++) {

distance[i][j]=MAX;

if(i==j)

distance[i][j]=0;

}

}

//读取数据,设置权值

for (int i = 0; i < edgeNum; i++) {

distance[in.nextInt()][in.nextInt()]=in.nextInt();

}

//起点

int v0=in.nextInt();

//结束点

int end=in.nextInt();

in.close();

for (int i = 0; i < vNum; i++) {

for (int j = 0; j

int index=i;

for (int k = 0; k < vNum; k++) {

if(distance[i][j]>distance[i][k]+distance[k][j])

{

distance[i][j]=distance[i][k]+distance[k][j];

index=k;

}

}

path[i][j]=index;

}

}

System.out.println("最短路径长为:"+distance[v0][end]);

System.out.print("路径为:"+end+" ");

while(true)

{

if(end==v0)

break;

System.out.print(path[v0][end]+" ");

end=path[v0][end];

}

}

}

测试数据:

6 8

0 4 30

0 2 10

0 5 100

1 2 5

2 3 50

4 5 60

4 3 20

3 5 10

0 3

输出:

最短路径长为:50

路径为:3 4 0

我觉得分享是一种精神,分享是我的乐趣所在,不是说我觉得我讲得一定是对的,我讲得可能很多是不对的,但是我希望我讲的东西是我人生的体验和思考,是给很多人反思,也许给你一秒钟、半秒钟,哪怕说一句话有点道理,引发自己内心的感触,这就是我最大的价值(这是我喜欢的一句话,也是我写博客的初衷)

java无权图求最短路径_求有权图和无权图的最短路径相关推荐

  1. sip 时序图_时序图怎么看_教你如何看懂时序图 - 什么是时序图_时序图怎么看_教你如何看懂时序图...

    时序图怎么看_教你如何看懂时序图 操作时序永远使用是任何一片IC芯片的最主要的内容.一个芯片的所有使用细节都会在它的官方器件手册上包含.所以使用一个器件事情,要充分做好的第一件事就是要把它的器件手册上 ...

  2. c语言迭代法求平方根_求平方根问题 (C++ 实现)

    下面是用二分法和牛顿迭代法求一个正数的平方根. 二分法 这里的题目稍微宽了一点点,包含了整数和小数的情况,这里二分法就不用多说了,如果中间值的平方与目标值在误差范围内,则返回,否则根据大小情况改变左/ ...

  3. java uml类图虚线实线_终于明白六大类UML类图关系了

    UML,全称Unified Modeling Language,统一建模语言.而UML图分为用例图.类图.对象图.状态图.活动图.时序图.协作图.构件图.部署图等9种图. 在面向对象语言中,我们经常看 ...

  4. 比较两组数据的差异用什么图更直观_芯片数据分析中常见的一些图的作用

    今天给大家讲讲芯片数据分析中常见的一些图的作用,让大家伙儿知道它们在BB些啥. 箱式图(Box plot) 基因芯片的原始数据是需要进行标准化处理的,主要目的是消除由于实验技术(如荧光标记效率.扫描参 ...

  5. 密度图的密度估计_不同类型的二维密度图小教程

    R相关小教程链接: 用R构建气泡图案例小教程 [小教程]散点图.饼图怎么在我的文章中完美展示小教程 热图在论文发表中完美呈现小教程 R与密度.函数.变量的微妙关系 北京市计算中心医用数据库建设解决方案 ...

  6. java 显示图片的一部分_求只显示图片上半部分三分之一的写法

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 import java.awt.*; import java.net.*; import javax.swing.*; public class Prac ...

  7. java大神请出来_求java大神,请分析以下代码,写出执行结果,并解释每行结果输出的原因。...

    求java大神,请分析以下代码,写出执行结果,并解释每行结果输出的原因.classPlate{publicPlate(){System.out.println("inPlateconstru ...

  8. java 求导函数_求导程序编写(oo-java编程)

    本单元的任务为求导. 即将一个含自变量x的多项式F求导成为另外一个含自变量x的多项式f.使得 dF/dx = f 为降低我们的难度,这个任务被分解成了三个阶段: (1)对幂函数进行求导(不允许嵌套) ...

  9. java 编程求图形面积_求java编程,计算长方形面积?

    求java编程,计算长方形面积? mip版  关注:195  答案:2  悬赏:0 解决时间 2021-01-28 06:47 已解决 2021-01-27 08:26 求java编程,计算长方形面积 ...

最新文章

  1. 数组的一些常用方法记录
  2. 用区块链变革教育行业?全球首个教育+旅行+区块链平台——Ambertime:让每个人都能够将时间凝结成自己专属的“琥珀”...
  3. SRA 练习:解释 CRUD 矩阵方法,并从上面 “用于化学品跟踪管理系统的 CRUDL 矩阵示例”图中找出被遗漏的需求,并解释是如何找的?
  4. python 函数中所有print保存csv_python for循环print怎样才能输出csv呢
  5. linux vi 撤销与恢复,vi撤销与恢复
  6. 富文本编辑器CKEditor 5开发环境搭建
  7. php 命令显示扩展信息
  8. iPhone前置排线教程
  9. pandas学习笔记(一):数据读入读出基本操作
  10. C语言程序设计第六次作业
  11. killer Linux驱动下载,The Linux Killer
  12. CSS教程:dashed和dotted的区别
  13. 小米路由器刷Xiaomi Mi WiFi Mini openwrt
  14. 笔记本显示器仅计算机,Nvidia X服务器设置仅显示1个屏幕(笔记本电脑+已连接外部显示器)...
  15. 基于jsp servlet javabean的学生管理系统
  16. 腾讯企业邮箱api java_腾讯企业邮箱API实现同步成员资料
  17. 电路仿真软件LTspice 使用教程
  18. SHELL命令里面的EQ、NE、GT、LT、GE、LE分别是什么意思
  19. 猴子?狒狒?傻傻分不清楚——制作tfrecord数据集并利用卷积神经网络训练实例
  20. Mac安装beego和bee时出现的问题

热门文章

  1. mysql查询20-30的数据_20. mysql查询表的数据大小
  2. android 教程概要,Android精通教程-第一节Android入门简介
  3. java list应用_java中list集合的应用
  4. 服务器raid1重装系统,做软RAID1 重装系统后数据会丢失吗
  5. OC 中NSString与NSString 的比较
  6. 【课题总结】OpenCV 抠图项目实战(1)目录摘要
  7. 怎样把电脑恢复出厂设置_数据蛙:苹果恢复出厂设置,彻底释放手机内存
  8. 不同存储结构的文件磁盘io操作次数_MySQL InnoDB存储引擎
  9. mulitpartfile怎么接收不到值_和平精英信号接收区和信号值是什么?信号值怎么恢复...
  10. 数据结构-栈3-栈的应用-就近匹配