爆难算法题一 据说北京某名牌大学全军覆没 大家讨论下
一个Internet站点集合,可以用如下的方式来描述站点和站点之间的链接引用关系:
s 1 2 3 4
1 / 4 0 3
2 3 / 4 5
3 2 2 / 2
4 6 1 4 /
其中与s(site)同行和同列的数字都表示站点号,其他每个数字表示一个站点到另一个站
点的超文本链接数。如果站点A有到另一个站点B的直接链接或间接(指通过一个或多个
直接链接)链接,则称站点A有到站点B的访问关系,或称站点B可以被站点A访问到。例
如,上面描述了一个有4个站点链接关系的站点集合,第一行 / 4 0 3 表示站点1到站点
1,2,3,4的超文本链接数。
请编写程序:
1) 将一个有N个站点的集合划分成满足下面所有条件的站点子集(这些子集的union组
成了该N个站点集合):
a) 当任一子集中的站点数大于1时,该子集内至少存在一个站点有到该子集内所有
其他站点的访问关系;
b) 当任一子集中的站点数大于1时,该子集内的任一站点至少可以被该子集内的某
一站点访问到;
c) 两个不同子集中的任意两个站点之间不存在任何访问关系。
2) 裁减这些子集内的站点之间现有的链接关系,使得被裁减后的各子集内的站点依然
可以满足上述所有条件,同时使得子集内的站点之间的链接总数相加之和为最小。
假如上面的站点集合是这N个站点集合中的一个子集,它满足了条件a):4可以访问到3,
也可以访问到2和1;也满足了条件b):站点4可以被站点3访问到,等等。对该站点集合
进行裁减使其仍然满足条件a和b,并使得其链接总数之和为最小的结果为:
s 1 2 3 4
1 / 0 0 0
2 0 / 0 0
3 2 0 / 2
4 0 1 4 /
这里,站点4可以访问到站点3和2,站点4也可以访问到站点1(通过站点3间接访问);
此外,站点3可以访问到站点4;最小链接总数相加为2+2+1+4=9。
输入数据:
程序读入已被命名为sites.txt的完全如上所示的N*N矩阵的输入数据文本文件,N不大于
10万(N即为行数和列数),输入文件的每一行的列和列之间用一个\t分隔,行和行之间
用\n分隔。
输出数据:
按行输出满足题目要求的每个子集内的站点数以及裁减后的最小链接总数之和,数和数
之间都以一个空格分隔。如上述子集和最小链接总数为:
1 2 3 4 9
如果输入数据无满足题目要求的子集存在,则输出NONE。