此题数据很奇怪,按理说应该是扫描出的输入数据应为对称矩阵,但是好像可能不是,所以录入数据的时候请自行对称一下。
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()的注释得到。