ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

图的最短路径问题(一)--深度优先搜索算法解决单源单向图

2022-03-08 19:35:23  阅读:222  来源: 互联网

标签:cur 递归 -- sum des 单源 搜索算法 int minSum


本人在博客园的第一篇题解,日期2022年3月8日晚上7点。

前言:本文适合有一定dfs基础和图论基础的人借鉴。

1.深度优先搜索算法(Deep First Search):

  不过度赘述,利用递归调用。下面给出模板。

1 void dfs(参数列表){
2     //剪枝
3 
4     //递归结束
5 
6     //递归
7     
8 }   

2.题目:(P3371 【模板】单源最短路径(弱化版) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn))

 

 

 

 

本题中,dfs核心代码如下:

 1 void dfs(int cur,int des,int sum){    
 2     //剪枝 
 3     if(sum>=minSum[des])return;
 4     //找到目标点,结束递归
 5     if(cur==des){
 6         minSum[des]=sum;//更新新小值
 7         return;
 8     }
 9     //递归
10     for(int i=1;i<=n;i++){
11         if( edge[cur][i]==-1)continue;
12         dfs(i,des,sum+edge[cur][i]);
13     }
14 }

 

其中,cur表示当前到达的元素,des表示终点元素,sum表示当前已经累计的合。

minSum[des]表示从s到当前终点的最短路径权值合。

剪枝部分:已经累积的合已然超过了之前搜索到的最小值,直接结束递归。

当cur==des,也就是找到终点元素,当前路径打通,结束递归,并且一定此时有sum<minSum[des]。

这里的edge[A][B]的值,表示从A->B路径的权值。

3.下面给出完整代码:

 1 /***
 2 
 3 ***/
 4 #include<iostream>
 5 #include<algorithm>
 6 using namespace std;
 7 //点,边,出发点
 8 // m 行 u v w
 9 // u->v权值w
10 const int Max=20;
11 const int Inf=2147483647;
12 int n,m,s;
13 int edge[Max][Max];
14 int minSum[Max];
15 void dfs(int cur,int des,int sum){    
16     //剪枝 
17     if(sum>=minSum[des])return;
18     //找到目标点,结束递归
19     if(cur==des){
20         minSum[des]=sum;//更新新小值
21         return;
22     }
23     //递归
24     for(int i=1;i<=n;i++){
25         if( edge[cur][i]==-1)continue;
26         dfs(i,des,sum+edge[cur][i]);
27     }
28 }
29 int main() {
30     cin>>n>>m>>s;
31     for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)edge[i][j]=-1;    //初始化邻接矩阵
32     while(m--){
33         int u,v,w;
34         cin>>u>>v>>w;
35         edge[u][v]=w;
36     }
37     fill(minSum+1,minSum+n+1,Inf);
38     for(int i=1;i<=n;i++){
39         dfs(s,i,0);
40         cout<<minSum[i]<<" ";
41     }
42     return 0;
43 }
44 
45     
46     

 

 

其中,edge邻接矩阵需要初始化,-1表示不连通。

fill()语句语法:fill(填充起始地址,结束地址,填充值); 

用来把数组整体赋值为一个非0值。

值得注意的是,当数据过大时,会出现stack overflow错误!栈溢出。

解决办法:换其他算法,待更新。

 

标签:cur,递归,--,sum,des,单源,搜索算法,int,minSum
来源: https://www.cnblogs.com/TsingPig/p/15982105.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有