prim算法的基本思想:
从连通网N={V,E}中的某一顶点U0出发,选择与它关联的具有最小权值的边(U0,v),将其顶点加入到生成树的顶点集合U中。以后每一步从一个顶点在U中,而另一个顶点不在U中的各条边中选择权值最小的边(u,v),把它的顶点加入到集合U中。如此继续下去,直到网中的所有顶点都加入到生成树顶点集合U中为止。
由于和dijkstra差不多,所以用邻接矩阵存储;
模板(低智商的我果断的把他取了个名字==)
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
cin >> g[i][j];
memset(minn,0x7f,sizeof(minn)); //初始化为maxint minn[1] = 0;
memset(u,1,sizeof(u)); //初始化为True,表示所有顶点为蓝点
for (i = 1; i <= n; i++)
{ int k = 0; for (j = 1; j <= n; j++) //找一个与白点相连的权值最小的蓝点k
if (u[j] && (minn[j] < minn[k]))
k = j;
u[k] = false; //蓝点k加入生成树,标记为白点
for (j = 1; j <= n; j++) //修改与k相连的所有蓝点
if (u[j] && (g[k][j] < minn[j])) minn[j] = g[k][j]; }
int total = 0;
for (i = 1; i <= n; i++) //累加权值
total += minn[i];
cout << total << endl;
return 0; }
时间: 2024-10-23 23:23:02