#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(); }
数据结构实验kruscal
猜你喜欢
转载自blog.csdn.net/judy2018/article/details/80567321
今日推荐
周排行