最好的车
最好的車
Time Limit : 3000/1000ms (Java/Other)???Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 18???Accepted Submission(s) : 6
Problem Description
H城是一個旅游勝地。每年都有成千上萬的人前來觀光。為方便游客。巴士公司在各個旅游景點及賓館、飯店等地都設置了巴士站并開通了一些單程巴士線路。每條單程巴士線路從某個巴士站出發。依次途徑若干個巴士站。最后到達終點巴士站。
一名旅客近期到H城旅游,他非常想其S公園游玩。但假設從他所在的飯店沒有一路巴士能夠直接到達S公園,則他可能要先乘某一路巴士坐幾站,再下來換乘同一站臺的還有一路巴士,這樣換乘幾次后到達S公園。
如今用整數1,2,...N給H城的全部的巴士站編號。約定這名旅客所在飯店的巴士站編號為1,S公園巴士站的編號為N。
寫一個程序。幫助這名旅客尋找一個最優乘車方案,使他在從飯店乘車到S公園的過程中換車的次數最少。
Input
有多組輸入數據,每組數據的第一行有兩個數字M和N(1<=M<=100 1<N<=500),表示開通了M條單程巴士線路,總共同擁有N個車站。從第2行到第M+1行依次給出了第1條到第M條巴士線路的信息。
當中第i+1行給出的是第i條巴士線路的信息,從左至右按執行順序依次給出了該線路上的全部站號,相鄰兩個站號之間用一個空格隔開。
Output
對于每組數據輸出僅僅有一行。假設無法乘巴士從飯店到達S公園。則輸出“NO”。否則輸出你的程序所找到的最少換車次數,換車次數為0,表示不需換車就可以到達。Sample Input
3 7 6 7 4 7 3 6 2 1 3 5Sample Output
2基本的還是對數據的處理,一個巴士線路上的站都僅僅要乘一次就到了,那么我們建立圖,假設i網站和j網站同一時候出如今一個巴士線路上就連一條邊,他們之間的權值為1.然后用最短路處理,dijkstra和floyed都能處理
#include <iostream>
#include <sstream>
#include <string>
#include <stdio.h>
#define MAX 100000099
#define Q 501
using namespace std;
void dijkstra(int);
int num[Q], a[Q][Q], dist[Q];
int main()
{
??? int M, N;
??? while(cin >> M >> N)
??? {
??????? for(int i = 1; i <= N; i++)
??????? {
??????????? for(int j = 1; j <= N; j++)
??????????????? a[i][j]=MAX;
??????????? dist[i]=MAX;
??????? }
??????? getchar();
??????? int len, x;
??????? string str;
??????? for (int i = 0; i < M; i++)
??????? {
?????????? getline(cin,str);
?????????? stringstream in(str);
?????????? len = 0;
?????????? while(in >> x)? num[++len] = x;
?????????? for (int j = 1; j < len; j++)
??????????????? for (int k = j+1; k <= len; k++)
??????????????????? a[num[j]][num[k]] = 1;
??????? }
??????? /*for (int i = 0; i <= N; i++)
??????? {
??????????? for (int j = 0; j <= N; j++)
??????????????? cout << a[i][j] << "\t";
??????????? cout << endl;
??????? }*/
??????? dijkstra(N);
??????? if(dist[N] == MAX)? cout << "NO" << endl;
??????? else cout << dist[N]-1 << endl;
??? }
}
void dijkstra(int n)
{
??? //s[N]為標記
?? ?int s[Q],newdist,i;
?? ?for(i=1;i<=n;i++)
?? ?{
?? ??? ?dist[i]=a[1][i];
?? ??? ?s[i]=0;
?? ?}
?? ?dist[1]=0;
?? ?s[1]=1;
?? ?for(i=2;i<=n;i++)
?? ?{
?? ???? //找出離初始位置最小的點
?? ??? ?int j,tem=MAX;
?? ??? ?int u=1;
?? ??? ?for(j=2;j<=n;j++)
?? ??? ??? ?if(!s[j]&&dist[j]<tem)
?? ??? ??? ?{
?? ??? ??? ??? ?u=j;
?? ??? ??? ??? ?tem=dist[j];
?? ??? ??? ?}
?? ??? ?s[u]=1;
?? ??? ?//更新dist[N]的值
?? ??? ?for(j=2;j<=n;j++)
?? ??? ?{
?? ??? ??? ?if(!s[j]&&a[u][j]<MAX)
?? ??? ??? ?{
?? ??? ??? ??? ?newdist=dist[u]+a[u][j];
?? ??? ??? ??? ?if(newdist<dist[j])
?? ??? ??? ??? ??? ?dist[j]=newdist;
?? ??? ??? ?}
?? ??? ?}
?? ?}
}
版權聲明:本文博客原創文章,博客,未經同意,不得轉載。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
- 上一篇: Mac OS X下查看CPU信息
- 下一篇: 2.ansible中常用模块