PTA 資料結構與演算法 7 8 哈利 波特的考試

2021-09-22 23:08:55 字數 1877 閱讀 3340

如有不對,不吝賜教

下面進入正題:

哈利·波特要考試了,他需要你的幫助。這門課學的是用魔咒將一種動物變成另一種動物的本事。例如將貓變成老鼠的魔咒是haha,將老鼠變成魚的魔咒是hehe等等。反方向變化的魔咒就是簡單地將原來的魔咒倒過來念,例如ahah可以將老鼠變成貓。另外,如果想把貓變成魚,可以通過念乙個直接魔咒lalala,也可以將貓變老鼠、老鼠變魚的魔咒連起來念:hahahehe。

現在哈利·波特的手裡有一本教材,裡面列出了所有的變形魔咒和能變的動物。老師允許他自己帶乙隻動物去考場,要考察他把這只動物變成任意乙隻指定動物的本事。於是他來問你:帶什麼動物去可以讓最難變的那種動物(即該動物變為哈利·波特自己帶去的動物所需要的魔咒最長)需要的魔咒最短?例如:如果只有貓、鼠、魚,則顯然哈利·波特應該帶鼠去,因為鼠變成另外兩種動物都只需要念4個字元;而如果帶貓去,則至少需要念6個字元才能把貓變成魚;同理,帶魚去也不是最好的選擇。

輸入格式:

輸入說明:輸入第1行給出兩個正整數n (≤100)和m,其中n是考試涉及的動物總數,m是用於直接變形的魔咒條數。為簡單起見,我們將動物按1~n編號。隨後m行,每行給出了3個正整數,分別是兩種動物的編號、以及它們之間變形需要的魔咒的長度(≤100),數字之間用空格分隔。

輸出格式:

輸出哈利·波特應該帶去考場的動物的編號、以及最長的變形魔咒的長度,中間以空格分隔。如果只帶1只動物是不可能完成所有變形要求的,則輸出0。如果有若干只動物都可以備選,則輸出編號最小的那只。

輸入樣例:

6 11

3 4 70

1 2 1

5 4 50

2 6 50

5 6 60

1 3 70

4 6 60

3 6 80

5 1 100

2 4 60

5 2 80

輸出樣例:

4 70

這道題目balabala說了半天,其實就是最短路徑問題,直接上floyd演算法就行,但是注意一點的就是迴圈中3個變數的順序,中間節點要放到最外層,即:

for

(k=1

;k<=n;k++

)for

(i=1

;i<=n;i++

)//含義 i j之間是否可以通過 k來縮短距離

}

這是因為floyd演算法實際上是動態規劃,k表示的是動態規劃的階段,可以這樣理解:

使用前k個節點來使圖中各節點的距離縮短,而k+1則表示在原來的基礎上新增乙個節點,這裡可以去看知乎上的回答

下面給**:

#include

#define inf 10000

struct animal

;int

main

(void

)for

(k=1

;k<=n;k++

)for

(i=1

;i<=n;i++

)//含義 i j之間是否可以通過 k來縮短距離

}for

(i=1

;i<=n;i++)if

(max

(target.index==-1

)printf

("0");

else

printf

("%d %d"

,target.index,target.maxlength)

;return0;

}

測試結果:

PTA資料結構與演算法題目集 中文 7 8

7 8 哈利 波特的考試 25 分 哈利 波特要考試了,他需要你的幫助。這門課學的是用魔咒將一種動物變成另一種動物的本事。例如將貓變成老鼠的魔咒是haha,將老鼠變成魚的魔咒是hehe等等。反方向變化的魔咒就是簡單地將原來的魔咒倒過來念,例如ahah可以將老鼠變成貓。另外,如果想把貓變成魚,可以通過...

PTA 資料結構與演算法 堆疊

1.棧底元素是不能刪除的元素。1分 tf 2.對順序棧進行進棧 出棧操作不涉及元素的前 後移動問題。1分 tf 3.若用data 1 m 表示順序棧的儲存空間,則對棧的進棧 出棧操作最多只能進行m次。1分 tf 4.通過對堆疊s操作 push s,1 push s,2 pop s push s,3 ...

PTA 資料結構與演算法 佇列

1.在用陣列表示的迴圈佇列中,front值一定小於等於rear值。1分 tf 2.迴圈佇列執行出隊操作時會引起大量元素的移動。1分 tf 3.棧是插入和刪除只能在一端進行的線性表 佇列是插入在一端進行,刪除在另一端進行的線性表。1分 tf 4.n個元素進隊的順序和出隊的順序總是一致的。1分 tf 1...