此題數據很奇怪,按理說應該是掃描出的輸入數據應爲對稱矩陣,但是好像可能不是,所以錄入數據的時候請自行對稱一下。
WA了很多次,最後還是蠻過了,稀裏糊塗的一道題。
不過算法抽象的不錯,以下面的數據爲例
【例1】
6
A:BEF
B:AC
C:BD
D:CEF
E:ADF
F:ADE
每兩個字母的聯通與否用二維圖來表示如下
1 1 0 0 1 1
1 1 1 0 0 0
0 1 1 1 0 0
0 0 1 1 1 1
1 0 0 1 1 1
1 0 0 1 1 1
現在開始處理,把粗體的位和同行對角線位相加,然後消去最大的一行一列
1 1 0 0 1 1
1 1 1 0 0 0
0 1 1 1 0 0
0 0 1 1 1 1
1 0 0 1 1 1
1 0 0 1 1 1
得到如下,然後繼續
2 1 0 0 1
1 1 1 0 0
0 1 1 1 0
0 0 1 2 1
1 0 0 1 2
3 1 0 0
1 1 1 0
0 1 1 1
0 0 1 3
3 1 0
1 1 1
0 1 2
直到變成二維,此時如果對角線兩個數字相等,而且(1,1)位爲1,說明最後的兩個字母聯通且需要添加頻道來間隔
如果數字不等,那麼OK,取大的就行,然後在對角線上掃描一遍,看是否有更大的數字,如果有,作爲結果,如果沒有,不管。
3 1
1 2
所以結果是:
3 channels needed.
【例2】
4
A:BC
B:ACD
C:ABD
D:BC
1 1 1 0
1 1 1 1
1 1 1 1
0 1 1 1
1 1 1 0
1 1 1 1
1 1 1 1
0 1 1 1
1 1 1
1 2 1
1 1 2
2 1
1 3
3 channels needed.
【例3】
4
A:BCD
B:ACD
C:ABD
D:ABC
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
2 1 1
1 2 1
1 1 2
3 1
1 3
4 channels needed.
【例4】
10
A:BC
B:A
C:A
D:G
E:HJ
F:I
G:DHI
H:EGJ
I:FGJ
J:EHI
1 1 1 0 0 0 0 0 0
1 1 0 0 0 0 0 0 0
1 0 1 0 0 0 0 0 0
0 0 0 1 0 0 1 0 0
0 0 0 0 1 0 0 1 0
0 0 0 0 0 1 0 0 1
0 0 0 1 0 0 1 1 1
0 0 0 0 1 0 1 1 0
0 0 0 0 0 1 1 0 1
0 0 0 0 1 0 0 1 1
1 1 1 0 0 0 0 0 0
1 1 0 0 0 0 0 0 0
1 0 1 0 0 0 0 0 0
0 0 0 1 0 0 1 0 0
0 0 0 0 1 0 0 1 0
0 0 0 0 0 1 0 0 1
0 0 0 1 0 0 1 1 1
0 0 0 0 1 0 1 1 0
0 0 0 0 0 1 1 0 1
0 0 0 0 1 0 0 1 1
1 1 1 0 0 0 0 0 0
1 1 0 0 0 0 0 0 0
1 0 1 0 0 0 0 0 0
0 0 0 1 0 0 1 0 0
0 0 0 0 2 0 0 1 0
0 0 0 0 0 1 0 0 1
0 0 0 1 0 0 1 1 1
0 0 0 0 1 0 1 2 0
0 0 0 0 0 1 1 0 2
1 1 1 0 0 0 0 0
1 1 0 0 0 0 0 0
1 0 1 0 0 0 0 0
0 0 0 1 0 0 1 0
0 0 0 0 2 0 0 1
0 0 0 0 0 2 0 0
0 0 0 1 0 0 2 1
0 0 0 0 1 0 1 2
1 1 1 0 0 0 0
1 1 0 0 0 0 0
1 0 1 0 0 0 0
0 0 0 1 0 0 1
0 0 0 0 3 0 0
0 0 0 0 0 2 0
0 0 0 1 0 0 3
1 1 1 0 0 0
1 1 0 0 0 0
1 0 1 0 0 0
0 0 0 2 0 0
0 0 0 0 3 0
0 0 0 0 0 2
1 1 1 0 0
1 1 0 0 0
1 0 1 0 0
0 0 0 2 0
0 0 0 0 3
1 1 1 0
1 1 0 0
1 0 1 0
0 0 0 2
1 1 1
1 1 0
1 0 1
2 1
1 1
3 channels needed.
程序如下,還是和以前一樣,請準備一個1084.txt作爲標準輸入源,演算過程可以通過打開對printM()的註釋得到。