一:题目

给定一个有N个顶点和E条边的无向图,顶点从0到N−1编号。请判断给定的两个顶点之间是否有路径存在。如果存在,给出最短路径长度。 这里定义顶点到自身的最短路径长度为0。 进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。

输入格式:
输入第1行给出2个整数N(0<N≤10)和E,分别是图的顶点数和边数。 随后E行,每行给出一条边的两个顶点。每行中的数字之间用1空格分隔。 最后一行给出两个顶点编号i,j(0≤i,j<N),i和j之间用空格分隔。

输出格式:
如果i和j之间存在路径,则输出"The length of the shortest path between i and j is X.",X为最短路径长度, 否则输出"There is no path between i and j."。

输入样例1:

7 6
0 1
2 3
1 4
0 2
1 3
5 6
0 3

结尾无空行
输出样例1:

The length of the shortest path between 0 and 3 is 2.

结尾无空行
输入样例2:

7 6
0 1
2 3
1 4
0 2
1 3
5 6
0 6

结尾无空行
输出样例2:

There is no path between 0 and 6.

二:思路

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

思路: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.我们将图的信息转换成树的结构,我们在遍历树的时候采用的就是BFS1>:首先我们将给定的两个结点的其中一个结点入队,接下来,将其出队当作扩展结点 这个新节点(在树当中的)有自己路径,还有权值和,以及层数。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_queue<Node>q; 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
//5 6
//4 5
//6 2//7 7
//0 1
//2 3
//1 4
//0 2
//1 3
//5 6
//4 5
//4 2

四:总结

分支限界如果只是会BFS,是远远不够的,即便我提前已经做过BFS的练习题了,其还是有一定 相当的难度,注意自己一定要画出相应的图解,可以帮助理解算法思想和构思代码

随手拍照,跟着考研上凌晨自习,感触颇多,没有了所谓大家的卷,其实都是在为自己人生路去努力拼搏,太喜欢这种学习的氛围了,感觉像是回到了高中,那种简单纯碎的学习和快乐 加油 大家

7-3 最短路径 (20 分)(分支限界+思路+详解)相关推荐

  1. 7-5 汽车加油问题 (20 分)(思路+详解)Come 宝!!!!!!!!!!!!!

    一:题目 题目来源:王晓东<算法设计与分析> 一辆汽车加满油后可行驶 n公里.旅途中有若干个加油站.设计一个有效算法,指出应 在哪些加油站停靠加油,使沿途加油次数最少. 输入格式: 第一行 ...

  2. 7-3 银行家算法--综合 (50 分)(思路+详解+分析输入)宝宝们 加油

    一:前言 这道题涉及到 银行家算法的申请资源 算法 还有 安全性检查的耍算法 那么强烈建议 把前面的学完再看本题 7-1 银行家算法–安全性检查 (20 分) 7-2 银行家算法–申请资源 (30 分 ...

  3. 7-2 批处理作业调度 (10 分)(思路+详解)

    一:题目:宝宝 你要永远开心,下雪了,多穿点, 输入格式: 第一行输入作业个数n. 第二行输入各任务在机器一上的完成时间. 第三行输入各任务在机器二上的完成时间. 输出格式: 最短完成时间和 输入样例 ...

  4. 7-7 硬币找钱问题 (10 分)(思路+详解+double类型数据的处理)Come baby!!!!!!!!!!!!!!!!!!!!

    一:题目 设有6 种不同面值的硬币,各硬币的面值分别为5 分,1 角,2 角,5 角,1 元,2元.现要用这些面值的硬币来购物.在购物中希望使用最少个数硬币.例如,1 次购物需要付款0.55 元,如果 ...

  5. 7-3 模板题 (10 分)(思路+详解)

    一:题目 二:思路 1.读题读不懂,那就分析给出的示例,本题意思就是给出一串数,然后找出找出该元素之后,第一个大于 该元素的下标(这一串数的下标是从一开始的)如果找不到比起大的,那就记为0 2.这里我 ...

  6. 8-1 回溯法实验报告 (15 分)(思路+详解)

    一:题目 给定k个正整数,用算术运算符+,-,,/ 将这k个正整数连接起来,是最终的得数恰为m. 如果有多组满足要求的表达式,只要输出一组,每一步算式用分号隔开. 如果无法得到m,得输出"N ...

  7. 7-3 作业调度算法--高响应比优先 (40 分)(思路+详解+vector容器做法)Come Baby!!!!!

    一:题目 输入N(N>0)个作业,输入每个作业的名字,到达时间,服务时间,按照高响应比优先算法,计算每个作业的完成时间,周转时间,带权周转时间(保留2位小数). 输入格式: 第一行输入作业数目, ...

  8. 7-2 作业调度算法--短作业优先 (30 分)(思路+详解+vector容器做法)Come Baby!!!!!!!!!!!

    一:题目 输入N(N>0)个作业,输入每个作业的名字,到达时间,服务时间,按照短作业优先算法,计算每个作业的完成时间,周转时间,带权周转时间(保留2位小数).输入格式: 第一行输入作业数目,第二 ...

  9. 7-1 作业调度算法--先来先服务 (30 分)(思路+详解+vector+map+map做法)Come Baby!!!!!!!!!!!

    一:题目: 输入N(N>0)个作业,输入每个作业的名字,到达时间,服务时间,按照先来先服务算法,计算每个作业的完成时间,周转时间,带权周转时间(保留2位小数). 输入格式: 第一行输入作业数目, ...

最新文章

  1. winform 在指定目录下已经生成资源Image图片的方式
  2. php对键盘控制,键盘控制 - 陈映亮的个人空间 - OSCHINA - 中文开源技术交流社区...
  3. 大型网站技术架构的原理与分析
  4. 给年轻人几点买房建议
  5. 搜狗拼音输入法漂亮皮肤 LeftSide 推荐下载
  6. MySQL 8.0.28 忘记密码,重置密码
  7. 非模式对话框CreateDialog() 与 模式对话框 DialogBoxParam()和DialogBox()
  8. git Tower 操作记录
  9. 合作博弈网页小游戏-Js源码
  10. IDEA破解码(至2099)
  11. 畅游陈德文:中国网游的发展与未来趋势
  12. 可视化全埋点系列文章之功能介绍篇
  13. Android Studio代码提示自动补全设置
  14. 企业上云规划与云原生环境设计
  15. cs ss ds es
  16. 慎读书,精读书,反复读好书并学以致用
  17. wps云文档 wps自动备份怎么设置和取消
  18. 2022 ICPC 西安站 赛后总结
  19. python如何绘制蜘蛛图_用Python写的图片蜘蛛人代码
  20. 上海交大25岁博士奶爸火了!6块腹肌,Science一作,人民日报都点赞了

热门文章

  1. Storm 1.0.1发布 .NET 适配也已到来
  2. elif是不是java关键字_C# 中的#if、#elif、#else、#endif等条件编译符号 (转载)
  3. [转]nginx反向代理网站(网易、百度之类的)
  4. Android Studio开发基础之启动Service,并通过从Activity向Service传递数据
  5. Android之打开手机系统相册
  6. Android之解决ScrollView嵌套RecycleView导致滑动冲突或者显示不全的问题
  7. C和指针之字符串简单实现strchr、strcmp函数
  8. mysql之主从复制 简书_MySQL主从复制(传统)
  9. buck变换器设计matlab_一种用于Boost PFC变换器的改进关断时间控制策略
  10. 这部纪录片央视发力了,每一帧都可以当壁纸,BBC也无法超越