航線設置

問題描述

在美麗的萊茵河畔,每邊都分佈着N個城市,兩邊的城市都是唯一對應的友好城市,現需要在友好城市間開通航線以加強往來,但因爲萊茵河常年大霧,如果開設的航線發生交叉就有可能出現碰船的現象。現在要求儘可能多地開通航線並且使航線不能相交。

輸入

有若干組測試數據,每組測試數據的第一行是一個整數n,它表示每邊都分佈着n個城市(1<=n<=1000)。接着有n行,每一行有2個整數s,t,之間有一個空格,s表示起點城市,t表示終點城市。

輸出

對每組測試數據,首先在一行上輸出“Case #:”,其中“#”爲測試數據組號,從1開始編號。接着在下一行輸出“The Maximal number is:”,緊跟着輸出這些城市間不相交的最大的航線數。

輸入樣例:

4

1 2

2 4

3 1

4 3

輸出樣例:

Case 1:

The Maximal number is:2

 

分析:

此問題可以演化成求最大不降子序列來完成。

設友好城市對數爲na[i]表示城市i唯一對應的友好城市編號,m[i]表示城市i處開始往後可以設置的最大航線條數,next[i]表示後繼,即下一條航線的開始位置,如爲0表示不能設置下一條航線。

對輸入的一對城市st,其轉換關係爲:a[s]=t

城市編號i

1

2

3

4

5

6

7

8

友好城市a[i]

3

1

5

4

2

8

7

6

m[i]

3

3

2

2

2

1

1

1

next[i]

3

3

6

6

6

0

0

0

從表中可以看出,最大航線數爲3,航線設置最好的開始位置爲城市1或城市2.通過next數組確定下一個設置航線的城市,如北岸城市選擇,應選136對應的友好城市爲368

很顯然,有狀態轉移方程m[i]=max{m[j]}+1,最後選擇使m值中最大的m[i]作爲航線設置最大數,對應的i可以作爲設置時北岸的第1個城市。

代碼:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章