图示
难点是:当选择最后一条边时,v2-v3是5,v1-v4也是5,但是v1-v4一旦连上就会出现环且这个图不是连通图,所以在代码中如何判断环的出现和保证最小生成树是连通的?
代码
//定义一个结构体记录生成树一条边的起始顶点和终止顶点,还有相应的权值的信息
typedef struct Edge
{
int x; // start
int y; // end
E cost;
}Edge;
int cmp(const void*a, const void *b)//比较权值的大小
{
return (*(Edge*)a).cost - (*(Edge*)b).cost;//转化类型后取权值
}
bool Is_same(int *father, int i, int j)//判断是否是相同的集合
{
while(father[i] != i)
{
i = father[i];
}
while(father[j] != j)
{
j = father[j];
}
return i==j;
}
void Mark_same(int *father, int i, int j)//标记为相同的集合
{
while(father[i] != i)
{
i = father[i];
}
while(father[j] != j)
{
j = father[j];
}
father[j] = i;
}
//最小生成树的实现