书上没有自己画好丑,无穷字符还打不出来
输入条件:
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
还有在书籍中的估计印刷错误: