7-3 最短路径 (20 分)(分支限界+思路+详解)(1)

最后

按照上面的过程,4个月的时间刚刚好。当然Java的体系是很庞大的,还有很多更高级的技能需要掌握,但不要着急,这些完全可以放到以后工作中边用别学。

学习编程就是一个由混沌到有序的过程,所以你在学习过程中,如果一时碰到理解不了的知识点,大可不必沮丧,更不要气馁,这都是正常的不能再正常的事情了,不过是“人同此心,心同此理”的暂时而已。

道路是曲折的,前途是光明的!”

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

思路:1.先判断输入的值之间是否有路径,可以通过DFS来遍历其中一个顶点的所有邻接点

如果另一个邻接点没有在其中,那么就说明 其是不通的

2.如果两个点是相连通的,那么我们接下来就是BFS遍历

3.我们将图的信息转换成树的结构,我们在遍历树的时候采用的就是BFS

1>:首先我们将给定的两个结点的其中一个结点入队,接下来,将其出队当作扩展结点

这个新节点(在树当中的)有自己路径,还有权值和,以及层数。

2>:然后就判断这个结点(树)是否已经到达了目标结点,如果到,那么判断这个结点

的路径和跟bestw的值看是否更新,

如果没到目标结点,判断其路径和跟已知bestw 如果比起大就进行剪枝操作

再接下来,就是开始遍历其邻接点入队操作。

4.注意代码中的 node.x[t] 这其中 t代表的是层数,node.x[t]代表的是图的一个结点号

在这里插入图片描述

三:上码

===================================================================

/**

分析:1.这个题没给边的权值,但我们通过示例可以大概知道默认的为 每条边的权值为1

思路:1.先判断输入的值之间是否有路径,可以通过DFS来遍历其中一个顶点的所有邻接点

如果另一个邻接点没有在其中,那么就说明 其是不通的

2.如果两个点是相连通的,那么我们接下来就是BFS遍历

3.我们将图的信息转换成树的结构,我们在遍历树的时候采用的就是BFS

1>:首先我们将给定的两个结点的其中一个结点入队,接下来,将其出队当作扩展结点

这个新节点(在树当中的)有自己路径,还有权值和,以及层数。

2>:然后就判断这个结点(树)是否已经到达了目标结点,如果到,那么判断这个结点

的路径和跟bestw的值看是否更新,

如果没到目标结点,判断其路径和跟已知bestw 如果比起大就进行剪枝操作

再接下来,就是开始遍历其邻接点入队操作。

4.注意代码中的 node.x[t] 这其中 t代表的是层数,node.x[t]代表的是图的一个结点号

*/

#include<bits/stdc++.h>

using namespace std;

int INF = 999999;

int maps[11][11];//存图用的数组。

int N,M;

int bestw = INF;

int cnt = 0;

int vis2[11] = {0};

struct Node{

int x[100];//记录树的路径

int layer;//记录层数

int cl;//记录已经走过的路径长度

};

bool operator<(const Node& a,const Node& b){

return a.cl > b.cl;//升序处理 小的数在前面

}

//判断是否可达

void dfs(int a,int b){

if(a == b){

cnt = 1;

return;

}

vis2[a] = 1;

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

if(vis2[i] != 1 && maps[a][i] == 1){

dfs(i,b);

}

}

// cout << “wyj”;

}

//

//求取最短路径

void bfs(int a,int b){

priority_queueq;

Node node1;

node1.cl = 0;

node1.layer = 0;//我们是从第0层开始的

for(int i = 0; i < N; i++){//初始化路径

node1.x[i] = i;

}

node1.x[0] = a;

q.push(node1);

while(!q.empty()){

int vis[11] = {0};

vis[a] = 1;

Node newnode;//扩展结点

newnode = q.top();

q.pop();

int t1 = newnode.layer;//代表当前的层数

int t2 = newnode.x[t1];//代表当前所到达的结点号

//比较该节点的路径中,是否到达了目标结点

if(t2 == b) {

if(newnode.cl < bestw){

bestw = newnode.cl;

}else{//到达目标结点 如果还未成功的话,那就不用继续往下遍历了

continue;

}

}

if(newnode.cl >= bestw)//进行剪枝操作

continue;

//将其扩展结点的邻接点入队

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

if(vis[j] != 1 && newnode.cl + maps[t2][j] < bestw) {

int flag = 1;

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

if(newnode.x[k] == j){

flag = 0;

}

}

if(flag == 0) continue; //这里主要处理的就是 不让这个路径往回走

vis[j] = 1;

//我们创建一个新的结点(在排列树当中)

Node node2;

node2.cl = newnode.cl + maps[t2][j];

node2.layer = t1 + 1;

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

node2.x[i] = newnode.x[i];

}

swap(node2.x[t1+1],j);//t1代表的是层数,node.x[t1]代表该层数所对应图当中的结点号

q.push(node2);

}

}

}

}

int main(){

int target1,target2;//两个目标结点

cin >> N >> M;

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

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

if(i == j){

maps[i][j] = 0;

}

maps[i][j] = INF;

}

}

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

int side1,side2;

cin >> side1 >> side2;

maps[side1][side2] = 1;

maps[side2][side1] = 1;

}

cin >> target1 >> target2;

dfs(target1,target2);

if(cnt == 0){

cout << "There is no path between “<< target1 <<” and " << target2 << “.”;

} else{

bfs(target1,target2);

cout << "The length of the shortest path between “<<target1 << " and “<< target2<<” is “<< bestw<<”.”;

}

}

//7 6

//0 1

//2 3

//1 4

//0 2

//1 3

//5 6

//0 6

//7 7

//0 1

//2 3

//1 4

//0 2

//1 3

//5 6

//4 5

//0 6

//7 7

//0 1

//2 3

//1 4

//0 2

//1 3

《MySql面试专题》

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

《MySql性能优化的21个最佳实践》

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

《MySQL高级知识笔记》

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

文中展示的资料包括:**《MySql思维导图》《MySql核心笔记》《MySql调优笔记》《MySql面试专题》《MySql性能优化的21个最佳实践》《MySq高级知识笔记》**如下图

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

关注我,点赞本文给更多有需要的人

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

407)]

[外链图片转存中…(img-NETjoq11-1715799942408)]

[外链图片转存中…(img-akuWpCzv-1715799942408)]

[外链图片转存中…(img-qQgGjOdJ-1715799942408)]

文中展示的资料包括:**《MySql思维导图》《MySql核心笔记》《MySql调优笔记》《MySql面试专题》《MySql性能优化的21个最佳实践》《MySq高级知识笔记》**如下图

[外链图片转存中…(img-JwHlJ6mg-1715799942409)]

关注我,点赞本文给更多有需要的人

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值