数据结构实验kruscal

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;
#define N 100
#define M 10010
int l;
int fa[N];
int n,m;
bool ma[N][N];//原图的邻接矩阵 
struct node1//存储最小生成树中边 
{
	int from,to,weight;
}e[M];
struct node//存储原图中的所有边 
{
    int u,v,w;
}edge[M];
int find(int x)//并查集中找树根 
{
    if (x == fa[x]) return x;
    else return fa[x] = find(fa[x]);
}
void add(int x, int y, int z)//添加边 
{
    l++;
    e[l].from = x;e[l].to = y;
    e[l].weight = z;
}


void print()//打印最小生成树中的边 
{
    for (int i=1;i<=l;i++)
        printf("%d->%d, %d\n", e[i].from, e[i].to, e[i].weight);
}




int partition(int low, int high)
{
	struct node pivot = edge[low];
	while (low < high)
	{
		while (low < high && edge[high].w > pivot.w) high--;
		edge[low] = edge[high];
		while (low < high && edge[low].w <= pivot.w) low++;
		edge[high] = edge[low];
	}
	edge[low] = pivot;
	return low;
}
void qsort(int l, int r)//快速排序  
{
	if (l<r)
	{
		int pivotpos = partition(l,r);
		qsort(l,pivotpos-1);
		qsort(pivotpos+1,r);
	}
}



void Kruskal()
{
    qsort(1,m);//qsort函数对原图中的所有边的按照权值进行排序 
    int s = 0;
    int ans = 0;
    int u,v;
    for (int i=1;i<=m;i++)
    {
        u = find(edge[i].u);//并查集 
        v = find(edge[i].v);
        if (u != v)
        {
            s++;//统计边数 
            ans += edge[i].w;//累加权值 
            fa[u] = v;
            add(edge[i].u, edge[i].v, edge[i].w);//添加最小生成树中的边 
        }
        if (s == n-1) break;
    }
    if (s < n-1)
        printf("There is no solution of MST!");//判断最小生成树无解 
    else
    {
        printf("The total weight of MST is %d\n", ans);//输出最小生成树的边总权值 
        print();//输出最小生成树中的左右边
    }

}



int main()
{
	printf("Please input the number of Vertexs n and the number of Edges of the Graph\n");
	printf("N = ");
	scanf("%d", &n);
	printf("M = ");
	scanf("%d", &m);
    for (int i=1;i<=n;i++) fa[i] = i;
    memset(ma,0,sizeof(ma));//存储原图 ,用邻接矩阵存储 
    for (int i=1;i<=m;i++)
    {
        scanf("%d%d%d", &edge[i].u, &edge[i].v, &edge[i].w);
        ma[edge[i].u][edge[i].v] = 1;
    }
    Kruskal();
}

猜你喜欢

转载自blog.csdn.net/judy2018/article/details/80567321