最小生成树的Prim算法也是贪心算法的一大经典应用。Prim算法的特点是时刻维护一棵树,算法不断加边,加的过程始终是一棵树。
Prim算法的过程从A开始 V = {A}, E = {}
选中边AF , V = {A, F}, E = {(A,F)}
选中边FB, V = {A, F, B}, E = {(A,F), (F,B)}
选中边BD, V = {A, B, F, D}, E = {(A,F), (F,B), (B,D)}
选中边DE, V = {A, B, F, D, E}, E = {(A,F), (F,B), (B,D), (D,E)}
选中边BC, V = {A, B, F, D, E, c}, E = {(A,F), (F,B), (B,D), (D,E), (B,C)}, 算法结束。
最后,我们来提供输入输出数据,由你来写一段程序,实现这个算法,只有写出了正确的程序,才能继续后面的课程。
第1行:2个数N,M中间用空格分隔,N为点的数量,M为边的数量。(2 = N = 1000, 1 = M = 50000) 第2 - M + 1行:每行3个数S E W,分别表示M条边的2个顶点及权值。(1 = S, E = N,1 = W = 10000)
输出最小生成树的所有边的权值之和。
9 14
1 2 4
2 3 8
3 4 7
4 5 9
5 6 10
6 7 2
7 8 1
8 9 7
2 8 11
3 9 2
7 9 6
3 6 4
4 6 14
1 8 8
输出示例
37
maxv=10001 n,m=list(map(int,input().split())) E=[] V=set([1]) cost=[] for i in range(n+1): a=[] for j in range(n+1): a.append(maxv) cost.append(a) for i in range(m): s,e,w=list(map(int,input().split())) cost[s][e]=w cost[e][s]=w closet=[0] lowcost=[maxv] for i in range(1,n+1): closet.append(1) lowcost.append(cost[1][i]) ans=0 for i in range(n-1): k=0 for j in range(2,n+1): if (lowcost[j]!=0) and (lowcost[j]lowcost[k]):k=j for j in range(2,n+1): if cost[j][k]lowcost[j]: lowcost[j]=cost[j][k] closet[j]=k ans+=lowcost[k] lowcost[k]=0 print(ans)
到此这篇关于Python 经典贪心算法之Prim算法案例详解的文章就介绍到这了,更多相关Python 经典贪心算法之Prim内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
标签:乌鲁木齐 银川 湘西 呼伦贝尔 呼伦贝尔 葫芦岛 安庆 三亚
巨人网络通讯声明:本文标题《Python 经典贪心算法之Prim算法案例详解》,本文关键词 Python,经典,贪心,算法,之,;如发现本文内容存在版权问题,烦请提供相关信息告之我们,我们将及时沟通与处理。本站内容系统采集于网络,涉及言论、版权与本站无关。