問題描述
在美麗的萊茵河畔,每邊都分佈着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
分析:
此問題可以演化成求最大不降子序列來完成。
設友好城市對數爲n,a[i]表示城市i唯一對應的友好城市編號,m[i]表示城市i處開始往後可以設置的最大航線條數,next[i]表示後繼,即下一條航線的開始位置,如爲0表示不能設置下一條航線。
對輸入的一對城市s和t,其轉換關係爲: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數組確定下一個設置航線的城市,如北岸城市選擇,應選1,3,6對應的友好城市爲3,6,8。
很顯然,有狀態轉移方程m[i]=max{m[j]}+1,最後選擇使m值中最大的m[i]作爲航線設置最大數,對應的i可以作爲設置時北岸的第1個城市。
代碼: