最少转机(无路径之和) 图的广度优先遍历

简介: 最少转机(无路径之和) 图的广度优先遍历




书上没有自己画好丑,无穷字符还打不出来


输入条件:

5 7 1 5

1 2

1 3

2 3

2 4

3 4

3 5

4 5


代码:


#include <stdio.h>
struct node{
  int x;  //城市编号
  int s;  //转机的次数 
};
int main()
{
  //需要队列
  struct node que[2501];
  int e[51][51]={0},book[51]={0};
  int head,tail;
  int i,j,n,m,start,end,flag=0,a,b,cur;
  scanf("%d%d%d%d",&n,&m,&start,&end);
  //初始化表格
  for(i=1;i<=n;i++)
  for(j=1;j<=n;j++){
    if(i==j)
    e[i][j]=0;
    else
    e[i][j]=999999;   
  }
  for(i=1;i<=m;i++){
  scanf("%d%d",&a,&b);
  e[a][b] = 1;
  e[b][a] = 1;
  }
  head=1;
  tail=1;
  que[tail].x = start; //队列第一个城市 
  que[tail].s = 0;
  tail++;
  book[start] = 1;  //表示访问过了 
  while(head<tail)
  {
  cur = que[head].x;
  //遍历表格中cur对应行 
  for(i=1;i<=n;i++){
    //如果该结果不为无穷且没有访问过,放入队列中 
    if(e[cur][i]!=999999&&book[i]==0){   
    que[tail].x = i;
    que[tail].s = que[head].s+1;
    tail++;
    book[i]=1;  //进行标记 
    }
    if(que[tail-1].x==end){
    flag=1;
    break;
    }
  }
  if(flag)
    break;
  head++;
  } 
  printf("最少进行%d次转机",que[tail-1].s); 
  return 0;
}


题意分析


本道题需要无向图,且无权,用一个表格来记录

依据队列来求出最少转机的次数,这道题用宽搜比较好


记录下我的错误点:

1.if(e[cur][i]!=999999&&book[i]==0) 后面的book[i] 我写成了book[cur]

2.que[tail].s = que[head].s+1; 后面的que[head].s+1 写成que[tail].s+1


要将一个点扩展的下标和这个点的下标分清楚,并且分清队列中head与tail


还有在书籍中的估计印刷错误:



相关文章
|
7月前
|
存储 算法
算法编程(二十六):判断路径是否相交
算法编程(二十六):判断路径是否相交
62 0
|
6月前
|
存储 算法 数据可视化
LeetCode 130题详解:深度优先搜索与广度优先搜索解决被围绕的区域
LeetCode 130题详解:深度优先搜索与广度优先搜索解决被围绕的区域
|
7月前
|
机器学习/深度学习 算法 测试技术
【单源最短路 图论】882. 细分图中的可到达节点
【单源最短路 图论】882. 细分图中的可到达节点
动态规划|【路径问题】|174.地下城游戏
动态规划|【路径问题】|174.地下城游戏
L2-020 功夫传人(树的建立和BFS)
L2-020 功夫传人(树的建立和BFS)
76 0
|
存储 索引
树与图中的dfs和bfs—— AcWing 846. 树的重心 AcWing 847. 图中点的层次
树与图中的dfs和bfs—— AcWing 846. 树的重心 AcWing 847. 图中点的层次
79 0
|
存储 索引
搜索与图论-树与图的广度优先遍历
搜索与图论-树与图的广度优先遍历
|
机器学习/深度学习 算法
LeetCode每日一题——882. 细分图中的可到达节点
给你一个无向图(原始图),图中有 n 个节点,编号从 0 到 n - 1 。你决定将图中的每条边 细分 为一条节点链,每条边之间的新节点数各不相同。
97 0
LeetCode每日一题——882. 细分图中的可到达节点
|
算法
【每日一题Day38】LC882细分图中的可到达节点 | 图论
给你一个无向图(原始图),图中有 n 个节点,编号从 0 到 n - 1 。你决定将图中的每条边 细分 为一条节点链,每条边之间的新节点数各不相同。
105 0
|
存储
【32. 图中的层次(图的广度优先遍历)】
思路 - 因为所有的`边长都为1`,所以可以使用`宽度优先搜索`的思想,每当队列pop出一个元素时,将其距离为1的节点都加到队列中(层次遍历思想) - `st[]`标记各个节点有没有走过,`d[]`保存1号节点到各个节点的距离,初始时都为-1。
148 0
【32. 图中的层次(图的广度优先遍历)】