最好的车
最好的車
Time Limit : 3000/1000ms (Java/Other)???Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 18???Accepted Submission(s) : 6
Problem Description
H城是一個(gè)旅游勝地。每年都有成千上萬的人前來觀光。為方便游客。巴士公司在各個(gè)旅游景點(diǎn)及賓館、飯店等地都設(shè)置了巴士站并開通了一些單程巴士線路。每條單程巴士線路從某個(gè)巴士站出發(fā)。依次途徑若干個(gè)巴士站。最后到達(dá)終點(diǎn)巴士站。
一名旅客近期到H城旅游,他非常想其S公園游玩。但假設(shè)從他所在的飯店沒有一路巴士能夠直接到達(dá)S公園,則他可能要先乘某一路巴士坐幾站,再下來換乘同一站臺(tái)的還有一路巴士,這樣換乘幾次后到達(dá)S公園。
如今用整數(shù)1,2,...N給H城的全部的巴士站編號。約定這名旅客所在飯店的巴士站編號為1,S公園巴士站的編號為N。
寫一個(gè)程序。幫助這名旅客尋找一個(gè)最優(yōu)乘車方案,使他在從飯店乘車到S公園的過程中換車的次數(shù)最少。
Input
有多組輸入數(shù)據(jù),每組數(shù)據(jù)的第一行有兩個(gè)數(shù)字M和N(1<=M<=100 1<N<=500),表示開通了M條單程巴士線路,總共同擁有N個(gè)車站。從第2行到第M+1行依次給出了第1條到第M條巴士線路的信息。
當(dāng)中第i+1行給出的是第i條巴士線路的信息,從左至右按執(zhí)行順序依次給出了該線路上的全部站號,相鄰兩個(gè)站號之間用一個(gè)空格隔開。
Output
對于每組數(shù)據(jù)輸出僅僅有一行。假設(shè)無法乘巴士從飯店到達(dá)S公園。則輸出“NO”。否則輸出你的程序所找到的最少換車次數(shù),換車次數(shù)為0,表示不需換車就可以到達(dá)。Sample Input
3 7 6 7 4 7 3 6 2 1 3 5Sample Output
2基本的還是對數(shù)據(jù)的處理,一個(gè)巴士線路上的站都僅僅要乘一次就到了,那么我們建立圖,假設(shè)i網(wǎng)站和j網(wǎng)站同一時(shí)候出如今一個(gè)巴士線路上就連一條邊,他們之間的權(quán)值為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]為標(biāo)記
?? ?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++)
?? ?{
?? ???? //找出離初始位置最小的點(diǎn)
?? ??? ?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;
?? ??? ??? ?}
?? ??? ?}
?? ?}
}
版權(quán)聲明:本文博客原創(chuàng)文章,博客,未經(jīng)同意,不得轉(zhuǎn)載。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
- 上一篇: Mac OS X下查看CPU信息
- 下一篇: 2.ansible中常用模块