普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树。意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点,且其所有边的权值之和亦为最小。该算法于1930年由捷克数学家沃伊捷赫·亚尔尼克发现;并在1957年由美国计算机科学家罗伯特·普里姆独立发现;1959年,艾兹格·迪科斯彻再次发现了该算法。因此,在某些场合,普里姆算法又被称为DJP算法、亚尔尼克算法或普里姆-亚尔尼克算法。
以上摘自维基百科。我简略地说下算法思想(或许不大严谨,想要看专业严谨版的朋友自行百度):
1.在把生成树看成一个集合(开始集合为空,到各个结点的距离当然未知) 2.结点与集合之间的权值可以看成结点到集合距离 3.将第一个结点加入集合,并初始化集合与其他结点的距离 4.搜索集合与结点最小的权值(距离),并把这点加入集合 5.更新集合与结点之间的距离 6.不断重复4和5步,直到所有的结点都加入了集合 (实际上把一个结点加入集合的时候,可以记录这个结点的父节点,也就是前驱,这么说吧,当找到一个与集合最小的结点的时候,他与集合中哪一结点的距离最小,把他记录来,作为生成树的路径)
算法实现如下:
|
|
输入样例:
|
|
输出样例:
|
|
大家可以新建prim.txt把输入样例写进去,改名成prim.in,然后解除注释这两行:
|
|
输出在prim.out中,用记事本打开可以看到结果。这样方便调试。