題目描述
H城是一個旅遊勝地,每年都有成千上萬的人前來觀光。為了方便遊客,巴士公司在各個旅遊景點及賓館、飯店等地都設定了巴士站並開通了一些單程巴士線路。每條單程巴士線路從某個巴士站出發,依次途經若干個巴士站,最終到達終點巴士站。一名遊客最近到H城旅遊,他很想去S公園遊玩。但如果從他所在的飯店沒有一路巴士可以直接到達S公園,則他可能需要先乘某一路巴士,坐幾站,再下來轉乘同一月台的另一路巴士,這樣轉乘幾次後到達S公園。現在用正數1,2,…,N給H城的所有的巴士站編號,約定這名遊客所在飯店的巴士站編號為1…S,公園巴士站的編號為N。編寫程式,協助這名遊客尋找一條最優乘車方案,使他在從飯店乘車到S公園的過程中換車的次數最少。 輸入格式
第一行有兩個數字M和N(1≤M≤100,1<N≤500),表示開通了M條單線巴士線路,總共有N個車站。從第二行到第M行依次給出了第1條到第M條巴士線路的資訊。其中第i+1 行給出的是第 i 條巴士線路的資訊,從左至右按運行順序依次給出了該線路上的所有站號,相鄰兩個站號之間用一個空格隔開。 輸出格式
輸出只有一行。如果無法乘巴士從飯店到達S公園,則輸出“NO”,否則輸出你的程式所找到的最少換車次數,換車次數為0表示不需換車即可到達。 範例輸入
3 7 6 7 4 7 3 6 2 1 3 5 範例輸出
2
三維狀態映像
讀入有些小問題。注意這種方法。
第一次最短路竟然寫錯了= =。
#include<stdio.h> int te[501],d[501][501]; bool v[501]; int n,m,len; char c; int main() { scanf("%d%d",&m,&n); for (int i=1;i<=m;++i) { c=1; len=0; while ((c!=-1)&&(c!='/n')) { scanf("%d",&te[++len]); c=-1; scanf("%c",&c); } for (int j=1;j<len;++j) for (int k=j+1;k<=len;++k) d[te[j]][te[k]]=1; } v[1]=true; while (1) { int k=0,min=9999999; for (int i=1;i<=n;++i) if (d[1][i]!=0) if ((!v[i])&&(d[1][i]<min)) { min=d[1][i]; k=i; } if (k==0) break; v[k]=true; for (int i=1;i<=n;++i) if (d[k][i]!=0) if ((!v[i])&&((d[1][k]+d[k][i]<d[1][i])||(d[1][i]==0))) d[1][i]=d[1][k]+d[k][i]; } if (d[1][n]==0) printf("NO/n"); else printf("%d/n",d[1][n]-1); return 0; }