0107 最小网络
* * * *
拉格朗日计划
* * * *
最小网络

下面这个无向网络有7个顶点和12条边,其总权重为243。



这个网络也可以用以下邻接矩阵表示如下。 $$\begin{matrix} & A & B & C & D & E & F & G \\ A & - & 16 & 12 & 21 & - & - & - \\ B & 16 & - & - & 17 & 20 & - & - \\ C & 12 & - & - & 28 & - & 31 & - \\ D & 21 & 17 & 28 & - & 18 & 19 & 23 \\ E & - & 20 & - & 18 & - & - & 11 \\ F & - & - & 31 & 19 & - & - & 27 \\ G & - & - & - & 23 & 11 & 27 & - \\ \end{matrix}$$ 在保证每对顶点之间都能连通的前提下,我们可以尝试移除该网络中的一些边以降低网络的总权重。总权重最低可以为93,如下图所示,相比原来的网络节省了$243-93=150$。



文件network.txt中是一个由40个节点所组成的网络的邻接矩阵。移除其中冗余的边,同时仍然保证每对顶点之间连通,求最多能节省的权重。

本题难度:



解答

本题是标准的最小生成树问题,此处用Prim算法可得结果为$261832-2153=259679$。

d=[]
with open("107_network.txt") as f:
    for line in f:
        d.append([int(i) if i.isdigit() else 0 for i in line.strip().split(",")])

m=sum(sum(i) for i in d)/2

a=set([0])
b=set(range(1,40))

s=0
while len(a) < 40:
    k=min([d[i][j],j] for i in a for j in b if d[i][j]>0)
    s+=k[0]
    a.add(k[1])
    b.remove(k[1])

print m,s,m-s