有向图 深搜 (城市地图 求最短距离)

简介: 有向图 深搜 (城市地图 求最短距离)


求出最短距离的方案。


这次也是搭配着矩形图来解决



在这里0就是代表自己相同点重合,无穷则代表两点之间没有关系,里面大于0的数字是两点之间的距离


举例子:

输入1 2 2 意思就是顶点1指向顶点2 两点之间距离为2

输入4 5 5 意思就是顶点4指向顶点5 两点之间距离为5


将顶点之间指向方向以及,两点之间距离等信息放在表中,在利用表中数据来求出


输入内容:

5 8

1 2 2

1 5 10

2 3 3

2 5 7

3 1 4

3 4 4

4 5 5

5 3 3


第一行 第一个5 的意思是创建5*5的表格  第二个8是等下输入8行
后面8行  就是8组(两个顶点+距离) 每组第一个指向第二个


代码:


#include <stdio.h>
int min=99999999,book[101],n,e[101][101];
//cur是当前所在的城市编号,dis是当前已经走过的路程 
void dfs(int cur,int dis)
{
  int j;
  //如果当前走过的路已经大于之前找到的最短路了,就可以返回了
  if(dis>min) return;
  if(cur==n)  //判断是否达到目标
  {
  if(dis<min)
    min = dis;
  return;
  } 
  //依次1-n个城市尝试
  for(j=1;j<=n;j++){
  if(e[cur][j]!=99999999&&book[j]==0)
  {
    book[j]=1; //标记已经访问了
    dfs(j,dis+e[cur][j]);  //从该城市出发继续寻找目标
    book[j]=0;   //访问完要取消访问 
  } 
  }
  return; 
} 
int main()
{
  int i,j,m,a,b,c;
  scanf("%d%d",&n,&m);
  //初始化二维矩阵
  for(i=1;i<=n;i++)
  for(j=1;j<=n;j++)
    if(i==j) e[i][j]=0;
    else   e[i][j]=99999999;
  for(i=1;i<=m;i++)
  {
  scanf("%d%d%d",&a,&b,&c);
  e[a][b] = c;
  }
  //进行标记 book[1]=1
  book[1]=1;
  dfs(1,0);  //从第一个点开始出发,0表示走过的路径
  printf("%d",min); 
  return 0;
}



最后运行结果为:9


整体大概过程

这里的9999999假设为无穷,e数组是个二维数组 就是表格用来存放关于顶点之间信息

book数组用来保存是否访问过该节点


第一步:输入表格的长度以及下面几组顶点方向及距离,给表格首先赋全值,后面根据8行再次填充对应表格位置的长度。


第二步:book的首位地址为1表示已经访问过了,进入dfs

先看其中for循环,首先第一步访问第一行数据,根据判断条件到第二个点满足,于是先给book数组对应记上已经访问过

紧接着进行调用自身进入第二组循环,(此时第一组for循环并没有执行完),在第二组循环中找到满足条件为3,book数组记上

现在进行第三行 (此时一,二组都没执行完) 第三行中第一个已经访问过,后面有找到对应的位置4 , book数组记上

进入第四行了 (此时一,二,三组都没执行完) 第四行中找到对应点为5 book数组记上

进入第五行 也就是目的点了


找到终点了,应当给出条件让它结束了 此时求出第一组例子的暂且最小值

此时是不是就结束了,并没有之前一二三组循环并没有结束 ,

我们回到第四行继续执行

5这个点找完后 这个循环也结束了

那么回到 第三个循环 这里最主要的一点就是在这个时候如果又找到下一个点

那么之前book中存的不还是生效嘛 所以在每次调用自身之后要将book数组中对应位置清0这步骤很关键

这样到下一个访问方案时才能够继续 按照之前的步骤 只要第一行遍历结束后整个过程就结束了,此时也会得到最小距离min

————————————————


相关文章
|
7月前
|
算法
最短路之Dijkstra算法
最短路之Dijkstra算法
64 0
|
机器学习/深度学习 编解码 算法
|
定位技术
BFS:迷宫最短路径
BFS:迷宫最短路径
116 0
拓扑排序(邻接表实现)
拓扑排序(邻接表实现)
201 0
拓扑排序(邻接表实现)
|
机器学习/深度学习 算法
无向图的算法:Kruskal算法与Prim算法生成最小生成树
无向图的算法:Kruskal算法与Prim算法生成最小生成树
205 0
|
算法
最小生成树:Kruskal算法(邻接表+最小堆+并查集)
最小生成树:Kruskal算法(邻接表+最小堆+并查集)
277 0
最小生成树:Kruskal算法(邻接表+最小堆+并查集)
|
机器学习/深度学习 定位技术
|
机器学习/深度学习 存储
图的遍历 无向图深搜 宽搜
图的遍历 无向图深搜 宽搜
图的遍历 无向图深搜 宽搜
|
机器学习/深度学习 定位技术