Prime算法的3中模板
Prime算法的基本思想
1.清空生成树,任取一个顶点加入生成树
2.在那些一个端点在生成树里,另一个端点不在生成树里的边中,选取一条权最小的边,将它和另一个端点加进生成树
3.重复步骤2,直到所有的顶点都进入了生成树为止,此时的生成树就是最小生成树
1. Prime不带参数void Prime (),默认从图顶点1开始
void prime()
{
int mincost, index, sum = 0;
for (int i = 0; i < n; i++)
{
dist[i] = graph[0][i];
visit[i] = 0;
}
// visit[0]=1;
for (int i = 0; i < n; i++)
{
mincost = inf;
for (int j = 0; j<n; j++)
{
if (visit[j] == 0 && dist[j] < mincost)
{
index = j;
mincost = dist[j];
}
}
visit[index] = 1;
sum += mincost;
for (int j = 0; j < n; j++)
{
if (visit[j] == 0 && dist[j] > graph[index][j])
dist[j] = graph[index][j];
}
}
printf("%d\n", sum);
}
2. Prime带一个参数int prime(int cur),参数是图的顶点个数
int prime(int cur)
{
int index;
int sum = 0;
memset(visit, false, sizeof(visit));
visit[cur] = true;
for(int i = 0; i <n; i ++){
dist[i] = graph[cur][i];
}
for(int i = 1; i < n; i ++){
int mincost = INF;
for(int j = 0; j < n; j ++){
if(!visit[j] && dist[j] < mincost){
mincost = dist[j];
index = j;
}
}
visit[index] = true;
sum += mincost;
for(int j = 0; j < m; j ++){
if(!visit[j] && dist[j] > graph[index][j]){
dist[j] = graph[index][j];
}
}
}
return sum;
}
3. Prime带两个参数,int prime(int cost[][101],int num), 参数是图的顶点个数和图的二维邻接矩阵
int prime(int data[][105],int num)
{
int mincost,index,sum=0;
for(int i=0;i<num;i++)
{
dist[i]=graph[0][i];
visit[i]=0;
}
visit[0]=1;
for(int i=1;i<num;i++)
{
mincost=inf;
for(int j=0;j<num;j++)
if(!visit[j]&&dist[j]<mincost)
{
mincost=dist[j];
index=j;
}
visit[index]=1;
sum+=mincost;
for(int j=0;j<num;j++)
if(visit[j]==0&&dist[j]>graph[index][j])
dist[j]=graph[index][j];
}
return sum;
}