1. 程式人生 > >最小生成樹-kruskal

最小生成樹-kruskal

kruskal weight 結束 起點 代碼 圖片 begin ++ ()

prim算法是以頂點為起點,kruskal是找權值最小的邊來構建,下面是主要代碼

邊數組類型:

struct Edge
{
int begin; //起始點
int end; //結束點
int weight; //權值
};

技術分享圖片

以上面圖為例,生成一個排序好的邊數組,如右圖

對邊數組進行排序的代碼為:

void EdgeSort(Edge *edge)
{
int i,j,m = 0;
for(i = 0;i<NumVertex;i++)
{
for(j = 0;j<NumVertex;j++)
{
if(Edges[i][j] != 0 && Edges[i][j] != MAX_COST)
{
edge[m].begin = i;
edge[m].end = j;
edge[m].weight = Edges[i][j];
m++;
Edges[j][i] = 0;
}
}
}
Edge t;
for(i = 0;i<m;i++)
{
for(j = 0;j<m-i-1;j++)
{
if(edge[j].weight > edge[j+1].weight)
{
t = edge[j];
edge[j] = edge[j+1];
edge[j+1] = t;
}
}
}
}

下面代碼為克魯斯卡爾算法代碼

int Find(int *parent,int f)
{
while(parent[f] > 0)
f = parent[f];
return f;
}
void Kruskal()
{
int i,j;
int m ,n;
Edge *edge = new Edge[NumEdge];
int *parent = new int[NumVertex];
EdgeSort(edge);

for( i = 0;i<NumVertex;i++)
parent[i] = 0;
for(i = 0;i<NumEdge;i++)
{
n = Find(parent,edge[i].begin);
m = Find(parent,edge[i].end);
if(m != n)
{
parent[n] = m;
cout<<edge[i].begin<<"-"<<edge[i].end<<":"<<edge[i].weight<<endl;
}
}
}

最小生成樹-kruskal