最小生成树 prim算法
---恢复内容开始---
最小生成树:n个顶点加上n-1条边生成一棵耗费最小代价的树
两种算法:prim和kruskal
第一种:prim算法(从相应顶点出发,每次找出权值最小的边,进行顶点连接,不能出现环路)
两个数组:lowcost[i]:以i为终点的边的权值 mst[i] 起始点
下一篇为kruskal
void MST(char vertex)
{
int n = NumVertex;
int *lowcost = new int[n]; //
int *mst = new int[n];
int i,j;
int k = GetVertexPos(vertex);
for(i = 0;i<n;i++) //对从k开始的lowcost和mst赋初值
{
if(i != k)
{
lowcost[i] = GetWeight(k,i);//从k到i的权值
mst[i] = k;
}
else
{
lowcost[i] = 0;
}
}
int min,min_index;
int begin,end;
for(i = 0;i<n-1;i++) //n个顶点,寻找n-1条边
{
min = MAX_COST;
min_index = -1;
for(j = 0;j < n;j++) //寻找最小的权值
{
if(lowcost[j] != 0 && lowcost[j] < min)
{
min = lowcost[j];
min_index = j; //记住最小权值的下标
}
}
begin = mst[min_index]; //从当前mst[min_index]所表示的顶点开始
end = min_index; //min_index为结束位置
cout<<Vertex[begin]<<"->"<<Vertex[end]<<":"<<min<<endl;
lowcost[min_index] = 0; //
int cost;
//更新lowcost数组以及mst数组
for(j = 0;j<n;j++)
{
cost = GetWeight(min_index,j);
if(cost < lowcost[j])
{
lowcost[j] = cost;
mst[j] = min_index;
}
}
}
}
---恢复内容结束---
最小生成树:n个顶点加上n-1条边生成一棵耗费最小代价的树
两种算法:prim和kruskal
第一种:prim算法(从相应顶点出发,每次找出权值最小的边,进行顶点连接,不能出现环路)
两个数组:lowcost[i]:以i为终点的边的权值 mst[i] 起始点
下一篇为kruskal
void MST(char vertex)
{
int n = NumVertex;
int *lowcost = new int[n]; //
int *mst = new int[n];
int i,j;
int k = GetVertexPos(vertex);
for(i = 0;i<n;i++) //对从k开始的lowcost和mst赋初值
{
if(i != k)
{
lowcost[i] = GetWeight(k,i);//从k到i的权值
mst[i] = k;
}
else
{
lowcost[i] = 0;
}
}
int min,min_index;
int begin,end;
for(i = 0;i<n-1;i++) //n个顶点,寻找n-1条边
{
min = MAX_COST;
min_index = -1;
for(j = 0;j < n;j++) //寻找最小的权值
{
if(lowcost[j] != 0 && lowcost[j] < min)
{
min = lowcost[j];
min_index = j; //记住最小权值的下标
}
}
begin = mst[min_index]; //从当前mst[min_index]所表示的顶点开始
end = min_index; //min_index为结束位置
cout<<Vertex[begin]<<"->"<<Vertex[end]<<":"<<min<<endl;
lowcost[min_index] = 0; //
int cost;
//更新lowcost数组以及mst数组
for(j = 0;j<n;j++)
{
cost = GetWeight(min_index,j);
if(cost < lowcost[j])
{
lowcost[j] = cost;
mst[j] = min_index;
}
}
}
}
浙公网安备 33010602011771号