當前位置:
首頁 >
最少换乘 第八届
發布時間:2025/3/16
27
豆豆
最少換乘
時間限制:2000?ms ?|? 內存限制:65535?KB 難度:3 描述?歐洲某城是一個著名的旅游勝地,每年都有成千上萬的人前來觀光旅行。Dr. Kong決定利用暑假好好游覽一番。。
年輕人旅游不怕辛苦,不怕勞累,只要費用低就行。但Dr. Kong年過半百,他希望乘坐BUS從住的賓館到想去游覽的景點,期間盡可量地少換乘車。
?
Dr. Kon買了一張旅游地圖。他發現,市政部門為了方便游客,在各個旅游景點及賓館,飯店等地方都設置了一些公交站并開通了一些單程線路。每條單程線路從某個公交站出發,依次途經若干個站,最終到達終點站。
但遺憾的是,從他住的賓館所在站出發,有的景點可以直達,有的景點不能直達,則他可能要先乘某路BUS坐上幾站,再下來換乘同一站的另一路BUS,?這樣須經過幾次換乘后才能到達要去的景點。
?
為了方便,假設對該城的所有公交站用1,2,……,N編號。Dr. Kong所在位置的編號為1,他將要去的景點編號為N。
請你幫助Dr. Kong尋找一個最優乘車方案,從住處到景點,中間換車的次數最少。
輸入接下來對每組測試數據:
第1行: M N 表示有M條單程公交線路,共有N站。(1<=M<=100 1<N<=500)
第2~M+1行: 每行描述一路公交線路信息,從左至右按運行順序依次給出了該線路上的所有站號,相鄰兩個站號之間用一個空格隔開。
AC代碼:
Dijkstra最短路算法就可以了
#include<iostream> #include<cstdio> #include<cstring> #define n 550 #define INF 0xFFFFFFF using namespace std; int s[n][n],dis[n],book[n]; int K,M,N; int main() {int i,j,k,t;char c[2*n+10];int a[n];int min,sum;while(cin>>K)while(K--){scanf("%d %d",&M,&N);for(i=1;i<=N;i++)for(j=1;j<=N;j++){if(i==j)s[i][j]=0;else s[i][j]=INF;}getchar();for(i=0;i<M;i++){t=0;gets(c);int p=strlen(c);for(j=0;j<p;j++){if(c[j]!=' '){sum=0;while(c[j]!=' '&&j<p){sum=sum*10+(c[j]-'0');j++;}a[t++]=sum;}}for(j=0;j<t;j++)for(k=j+1;k<t;k++)s[a[j]][a[k]]=1; }for(i=1;i<=N;i++) { dis[i]=s[1][i]; book[i]=0; } book[1]=1; for(i=1;i<=N;i++) { min=INF; for(j=1;j<=N;j++) if(!book[j] && dis[j]<min){ k=j; min=dis[j]; } book[k]=1; for(j=1;j<=N;j++) if(!book[j] && dis[k]+s[k][j]<dis[j]) dis[j]=dis[k]+s[k][j]; }if(dis[N]==INF)printf("NO\n");else printf("%d\n",dis[N]-1);}return 0; }
總結
- 上一篇: 【JEECG技术博文】JEECG表单配置
- 下一篇: 实战-Ueditor扩展二次开发