最少轉機(無路徑之和) 圖的廣度優先遍歷

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
書上沒有自己畫好醜,無窮字符還打不出來

輸入條件
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


還有在書籍中的估計印刷錯誤
在這裏插入圖片描述

   												 可以加羣一起討論交流:891507813
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章