【圖論】【RQNOJ】最優乘車_旅遊

來源:互聯網
上載者:User

  題目描述

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; }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.