書上沒有自己畫好醜,無窮字符還打不出來
輸入條件:
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