标题
最小生成树
时间限制
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);
}