XDOJ 最小二叉树的克鲁斯卡尔算法

标题

最小生成树

时间限制

2 S

内存限制

10000 Kb

问题描述:

        用克鲁斯卡尔(Kruskal)算法求无向网的最小生成树。

输入:

        输入数据第一行为两个正整数n(1<n<=30)和m(1<m<100),分别表示顶点数和边数。后面紧跟m行数据,每行数据是一条边的信息,包括三个数字,分别表示该边的两个顶点和边上的权值。

输出:

        按顺序输出Kruskal算法求得的最小生成树的边集,每行一条边,包括三个数字,分别是该边的两个顶点和边上的权值,其中第一个顶点的编号应小于第二个顶点的编号。

示例输入

8 11

1 2 3

1 4 5

1 6 18

2 4 7

2 5 6

3 5 10

3 8 20

4 6 15

4 7 11

5 7 8

5 8 12

示例输出

1 2 3

1 4 5

2 5 6

5 7 8

3 5 10

5 8 12

4 6 15

完全按照数据结构书上p163的算法写的

#include<stdio.h>
#include<math.h>
 
struct Edge
{
	int Head;
	int Tail;
	int cost;
};

int Vexset[31];

void Sort(struct Edge ED[], int arcnum)
{
	int i, j;
	struct Edge temp;
	for (i = 0; i < arcnum - 1; i++) 
	{
	    for (j = 0; j < arcnum - i - 1; j++) {
	        if (ED[j].cost > ED[j + 1].cost) {
	            temp = ED[j];
	            ED[j] = ED[j + 1];
	            ED[j + 1] = temp;
	        }
	    }
    }
}

void MiniSpanTree_Kruskal(struct Edge ED[],int vexnum,int arcnum)
{
	Sort(ED,arcnum);
	for (int i = 0; i<vexnum; i++)
	Vexset[i] = i;
	for (int i =0; i<arcnum;++i)
	{
		int v1 = ED[i].Head;
		int v2 = ED[i].Tail;
		int vs1 = Vexset[v1-1];
		int vs2 = Vexset[v2-1];
		if (vs1 != vs2)
		{
			int min = 0, max = 0;
			min = (int)fmin(ED[i].Head, ED[i].Tail);
			max = (int)fmax(ED[i].Head, ED[i].Tail);
			printf("%d %d %d\n", min, max, ED[i].cost);
		}
		for (int j = 0; j<vexnum;++j)
		if (Vexset[j] == vs2) Vexset[j] = vs1;
	}
}

int main()
{
	struct Edge ED[31];
	int vexnum,arcnum;
	scanf("%d %d",&vexnum,&arcnum);
	for (int i = 0; i < arcnum; ++i)
	scanf("%d %d %d", &ED[i].Head, &ED[i].Tail, &ED[i].cost);
	MiniSpanTree_Kruskal(ED,vexnum,arcnum);
} 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值