本文主要是介绍最少转机(无路径之和) 图的广度优先遍历,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
书上没有自己画好丑,无穷字符还打不出来
输入条件:
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;elsee[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
还有在书籍中的估计印刷错误:
可以加群一起讨论交流:891507813
这篇关于最少转机(无路径之和) 图的广度优先遍历的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!