原題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表示不需換車即可到達示例1
3 7
6 74 7 3 6
2 1 3 5
2
最初的解題有兩個想法:
後面發現,建圖時,將同一線路按照車站的行駛順序,將每點能到的車站的權值記錄為1。
比如 4 -> 7 -> 3 -> 6 這條線路,由4能到的車站有 7 3 6,那麼就將e(鄰接矩陣)e[4][7]=1,e[4][3]=1,e[4][6]=1。同理,7能到的車站有3 6,那麼就將e[7][3]=1,e[7][6]=1。
通過這樣的處理就會發現,如果需要轉乘,那麼在從轉乘點到這條線路上的任何點的權值都是1。
#include
#include
#define inf 9999999
#define min(x,y) x>y?y:x
int m,n;
int a[
505]
;int e[
505]
[505];
intmain()
for(
int i=
1;i1;i++
)for
(int j=i+
1;j) e[a[i]
][a[j]]=
1;}for
(int k=
1;k<=n;k++
)for
(int i=
1;i<=n;i++
)for
(int j=
1;j<=n;j++)if
(e[i]
[j]>e[i]
[k]+e[k]
[j])
e[i]
[j]=e[i]
[k]+e[k]
[j];
if(e[1]
[n]>=inf)
printf
("no\n");
else
printf
("%d"
,e[1
][n]-1
);return0;
}
牛客網 single number系列題解
給定乙個整型陣列,除乙個元素僅出現一次之外,其餘每個元素都出現兩次 三次 試著找出這個元素。此類題目,若每個元素出現i次,如果將問題的視角放在資料位上來看的話,實際上就是除那個 single number 所在的bits外,每個bit上出現資料的次數 i 0。1.兩次 a.常規思路 class so...
牛客網 壓縮演算法
小q想要給他的朋友傳送乙個神秘字串,但是他發現字串的過於長了,於是小q發明了一種壓縮演算法對字串中重複的部分進行了壓縮,對於字串中連續的m個相同字串s將會壓縮為 m s m為乙個整數且1 m 100 例如字串abcabcabc將會被壓縮為 3 abc 現在小q的同學收到了小q傳送過來的字串,你能幫助...
牛客網 sql 題目練習筆記
題目 查詢各個部門當前 dept manager.to date 9999 01 01 領導當前 salaries.to date 9999 01 01 薪水詳情以及其對應部門編號dept no 注 請以salaries表為主表進行查詢,輸出結果以salaries.emp no公升序排序,並且請注意...