[英]Kruskal's Algorithm In C And What It Does
我的教授給了我這個代碼,讓我可以使用Kruskal算法查找MST。 但是,我不完全了解需要什么
int parent[10]
是,當我們使用功能時發生了什么
find()
和
uni()
以下是他給我們的完整代碼。
#include <stdio.h>
int parent[10];
int find(int i)
{
while(parent[i])
{
i=parent[i];
}
return i;
}
int uni(int i,int j)
{
if(i!=j)
{
parent[j]=i;
return 1;
}
return 0;
}
int main(void)
{
int cost[10][10],u,v,i,j,min,mincost=0,n,ne=1,a,b;
printf("Enter no. of vertices: ");
scanf("%d",&n);
printf("Enter Adjacency Matrix:\n");
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
scanf("%d",&cost[i][j]);
}
}
while(ne<n)
{
min=999;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(cost[i][j]<min)
{
min=cost[i][j];
a=u=i;
b=v=j;
}
}
}
u=find(u);
v=find(v);
if(uni(u,v))
{
printf("\n%d edge(%d -> %d)=%d",ne++,a,b,min);
mincost += min;
}
cost[a][b]=cost[b][a]=999;
}
printf("\nMin. cost of spanning tree=%d",mincost);
return 0;
}
我只是想對我上面提到的三件事做一個解釋。 除了我所說的三件事外,我了解算法的工作原理。
謝謝
此代碼最多支持10個頂點。
parent
正在跟蹤節點的父級。 find
用於查找沒有任何父級的集合(例如A)中的頂點。 因此,如果u在集合A中,而v在集合B中,則這兩個集合將通過uni
函數進行合並。 這段代碼有效,但不是您編寫代碼的方式。
關於算法本身:
Kruskal是一種貪婪算法,用於以最小(或最大成本)找到最小生成樹。 算法如下:
uv
請檢查u
和v
屬於同一集合。 如果是,則不重復步驟2。 u
和v
的集合,即如果u在集合A中並且v在集合B中,則將A和B並集為C並丟棄A和B。現在u
和v
屬於C。從步驟2重復。 這是一個更好的代碼: https : //github.com/26prajval98/DSA/blob/master/graph%20algorithms/kruskal/main.c
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.