java无权图求最短路径_求有权图和无权图的最短路径

无权图的最短路径

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/571477.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无限级分类及生成json数据

第一步,先去数据库查询类别数据,然后交给生成json数据的函数处理,代码如下: 1 /*生成类别JSON数据*/ 2 public function wirteJson(){ 3 $dataInfo \think\Db::query("select id as v,name as n,pid from think_pro_category"); 4 $data $this…

python游戏图像识别_利用python做图像识别

Python验证码识别处理实例(转)一、准备工作与代码实例1、PIL、pytesser、tesseract(1)安装PIL&#xff1a;下载地址&#xff1a;http://www.pythonware.com/products/pil/(CSDN下载)下载后是一个exe&#xff0c;直接双击安装&#xff0c;它会自动安装到C:\Python27\Lib\site-pa…

Java旅游动吧项目讲解_springboot动吧项目

架构分析页面流程业务分析&#xff1a;客户端向服务端发送一个请求&#xff0c;发向了Tomcat&#xff0c;如果Tomcat只有一个线程是不可能处理多个请求的&#xff0c;所以就需要一个多个线程的池资源&#xff0c;然后线程用I/O读取请求中的数据&#xff0c;然后服务器从http协议…

java并发-内存模型与volatile

JMM的关键技术点都是围绕着多线程的原子性、可见性和有序性来建立的。因此&#xff0c;我们首先必须了解这些概念 1&#xff0c;原子性 原子性是指一个操作是不可中断的。即使是在多个线程一起执行的时候&#xff0c;一个操作一旦开始&#xff0c;就不会被其他线程干扰&#xf…

python glob函数_python glob 模块 map函数

昨晚有了点小想法&#xff0c;想写个小脚本。用到了 glob 模块 和 map 函数 觉得他们配合起来和不错的。#coding:utf8import globprint "glob.golb 方法返回 " , glob.glob(r"/var/log/*.log")a glob.iglob(r"/var/log/*.log")print &qu…

数据分析师免费课程网址

分享一些免费的课程以下课程免费&#xff0c;讲师都是领域的专家&#xff0c;需要提前报名&#xff0c;请注意开班的时间。Coursera.org&#xff1a;统计学。Coursera.org&#xff1a;机器学习。Coursera.org&#xff1a;数据分析的计算方法。Coursera.org&#xff1a;大数据。…

微信机器人红包java_微信机器人_奇迹蛋_java实现

【实例简介】参考了别人的一些微信开发方法&#xff0c;自己实现了一个简单的微信机器人&#xff0c;部署在百度云上&#xff0c;能够点歌&#xff0c;查询天气&#xff0c;调教对话。可关注微信公众号&#xff1a;奇迹蛋。实现说明&#xff1a;http://blog.csdn.net/elcarim/a…

python增量赋值是什么意思_关于python中的增量赋值的理解

增量赋值运算符 和 * 的表现取决于它们的第一个操作对象 操作首先会尝试调用对象的 __ iadd__方法&#xff0c;如果没有该方法&#xff0c;那么尝试调用__add__方法&#xff0c;所以 与 的区别实质是__iadd__ 与 __add__的区别&#xff0c;同理&#xff0c;* 操作首先会尝试调…

Notepad++使用教程

Notepad 快捷键 大全CtrlC 复制CtrlX 剪切CtrlV 粘贴CtrlZ 撤消CtrlY 恢复CtrlA 全选CtrlF 键查找对话框启动CtrlH 查找/替换对话框CtrlD 复制并粘贴当行CtrlL 删除当前行CtrlT 当行向上移动一行F3 查找下一个ShiftF3 查找上一个CtrlShiftF 组合在文件中查找CtrlF3 查找&#x…

安卓手机刷软路由_华为路由AX3 Pro上手测评:用过最方便的路由器,没有之一...

都说"科技改变生活"&#xff0c;但我总觉着&#xff0c;现如今的人们似乎被数码产品"奴役"了。比如说&#xff1a;之前买过某品牌路由器&#xff0c;设置过程之繁琐&#xff0c;直接让当时是数码小白的我崩溃了。自打那之后&#xff0c;我选购数码产品的标…

ECharts.js学习(二)动态数据绑定

Echarts 数据绑定 简单的统计表已经可以生成&#xff0c;不过之前图标数据都是直接写在参数里面的&#xff0c;而实际使用中&#xff0c;我们的数据一般都是异步读取的。EChart.js对于数据异步读取这块提供了异步加载的方法。 绑定多组数据 很多时候需要展示的数据不单单是一组…

黑苹果2k屏_一加手机屏幕新特性:120Hz、2K+ OLED、10bit

在发布了旗下的首款概念手机Concept One后&#xff0c;再次有消息显示一加将在1月13日也就是今天举办“屏幕技术沟通会”。而在发布会正式到来前&#xff0c;一加CEO刘作虎则在微博表示&#xff0c;一加已经完成了120Hz屏幕的研发。沟通会上还会聊一聊一加90Hz 流体屏引领行业后…

popupmenu java_Java基于JPopupMenu实现系统托盘的弹出菜单,解决PopupMenu弹出菜单中文乱码...

本人萌新&#xff0c;利用业余时间学习Java。最近在写一个GUI程序的时候遇到一个问题&#xff0c;系统托盘创建弹出菜单中文乱码&#xff0c;网上搜索很多内容都没有找到解决方案&#xff0c;现将个人解决方案分享给大家&#xff0c;希望有所帮助一、PopupMenu存在的问题标准文…

QT获取主机名称

//获取主机名 QString localHost QHostInfo::localHostName(); 转载于:https://www.cnblogs.com/amwuau/p/8021758.html

Java哈利波特死亡圣器下_如果编程语言是《哈利波特》中的人物

如果编程语言是《哈利波特》中的人物&#xff0c;本文是作者的一些观点&#xff0c;如果你有不同的看法&#xff0c;欢迎在留言中告诉我们。C语言每个人都在说&#xff0c;C语言已经死了至少十年以上了。人们对它嗤之以鼻。当然它也曾不可一世&#xff0c;肆虐横行&#xff0c;…

序列每天从0开始_【算法打卡】分割数组为连续子序列

难度&#xff1a;中等题目&#xff1a;给你一个按升序排序的整数数组 num(可能包含重复数字)&#xff0c;请你将它们分割成一个或多个长度为 3 的子序列&#xff0c;其中每个子序列都由连续整数组成。如果可以完成上述分割&#xff0c;则返回 true &#xff1b;否则&#xff0c…

linux中 /dev/null命令

/dev/null &#xff1a;代表空设备文件 > &#xff1a;代表重定向到哪里&#xff0c;例如&#xff1a;echo "123" > /home/123.txt1 &#xff1a;表示stdout标准输出&#xff0c;系统默认值是1&#xff0c;所以">/dev/null"等同于"1>/d…

php会员系统源码_b2b2c商城系统会员预存款架构及源码分享

业务需求可以为预存款充值&#xff0c;在支付订单时使用预存款支付功能当预存款余额>商品订单总金额时&#xff0c;完全抵扣商品订单金额&#xff1b;当预存款余额架构一、 充值二、 数据结构1、会员钱包表(es_member_wallet)2、 后期可能会将会员积分等关于消费抵扣相关信息…

mongodb 去重查询 Java,mongodb篇二:mongodb克隆远程数据库,去重查询的命令及对应java语句...

另外附上mongodb eclipse插件地址&#xff1a; http://www.jumperz.net/update/ import java.net.UnknownHostException;import com.mongodb.DB;import com.mongodb.DBCol1.首先操作mongodb最基本命令&#xff1a;:show databases; ---------------------显示全部数…

HTML5 规范

在学习编程的时候&#xff0c;每次看到那些整齐规范的代码&#xff0c;心里顿时对这个程序员表示点点好感&#xff0c;有时&#xff0c;比如看到自己和朋友写的代码时&#xff0c;那阅读起来就是苦不堪言&#xff0c;所以&#xff0c;一些基本的开发规范是必须的&#xff0c;是…