kruskal算法的理解

一、把原始图的N个节点看成N个独立子图;

二、每次选取当前最短的边(前提操作是?),看两端是否属于不同的子图;若是,加入;否则,放弃;

三、循环操作该步骤二,直到有N1条边;

再次算法中要用到并查集对各个节点进行判断;

对并查集不理解的可以参看此ppt  

如果对下文看不太懂可以参看这篇文章



#include <stdio.h>
#include <stdlib.h>
#define MAXVEX 100
#define MAXEDGE 100

typedef struct 		//图的边集数组表示形式
{
	int begin;
	int end;
	int weight;
}Edge;

/* 交换权值 以及头和尾 */
void Swapn(Edge *edges,int i, int j)
{
	int temp;
	temp = edges[i].begin;
	edges[i].begin = edges[j].begin;
	edges[j].begin = temp;
	temp = edges[i].end;
	edges[i].end = edges[j].end;
	edges[j].end = temp;
	temp = edges[i].weight;
	edges[i].weight = edges[j].weight;
	edges[j].weight = temp;
}

/* 对权值进行排序 */
void sort(Edge edges[],MGraph *G)
{
	int i, j;
	for ( i = 0; i < G->numEdges; i++)
	{
		for ( j = i + 1; j < G->numEdges; j++)
		{
			if (edges[i].weight > edges[j].weight)
			{
				Swapn(edges, i, j);
			}
		}
	}
	printf("权排序之后的为:\n");
	for (i = 0; i < G->numEdges; i++)
	{
		printf("(%d, %d) %d\n", edges[i].begin, edges[i].end, edges[i].weight);
	}

}

int FindParent(int *parent,int f)       //找到点f所在集合的根节点
{
    if(f!=parent[f])
        return parent[x]=FindParent(parent[f]);
    return x;
}
int k;          //总共有k个顶点
void MiniSpan_Kruskal(MGraph G)
{
int i,n,m;
Edge edges[MAXEDGE];
int parent[MAXVEX];
for(i=0;i<m;i++)    
    {
        parent[i]=i; //初始化,使各个节点属于不同的集合
    }               
    for(i=0;i<k;i++)
    {
        n=FindParent(parent,edge[i].begin)
        m=FindParent(parent,edge[i].end)
        if(m!=n)        //根节点不同,所以即m和n不属于一个集合
        {
            parent[n]=m;    //将两个集合进行合并
        }
        printf("(%d%d)%d",edges[i].begin,edges[i].end,edges[i].weight);
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值