@@ -562,4 +562,75 @@ if __name__ == "__main__":
562562### Dart
563563
564564### C
565+ 并查集方法一
566+ ``` c
565567
568+ // 定义边结构体,包含两个顶点vex1和vex2以及它们之间的权重val
569+ struct Edge
570+ {
571+ int vex1, vex2, val;
572+ };
573+
574+ // 冒泡排序函数,用于按边的权重val不减序排序边数组
575+ void bubblesort (struct Edge * a, int numsize)
576+ {
577+ for (int i = 0; i < numsize - 1; ++i)
578+ {
579+
580+ for (int j = 0; j < numsize - i - 1; ++j)
581+ {
582+ if (a[j].val > a[j + 1].val)
583+ {
584+ struct Edge temp = a[j];
585+ a[j] = a[j + 1];
586+ a[j + 1] = temp;
587+ }
588+ }
589+ }
590+ }
591+
592+ int main()
593+ {
594+ int v, e;
595+ int v1, v2, val;
596+ int ret = 0;
597+
598+ scanf("%d%d", &v, &e);
599+ struct Edge *edg = (struct Edge *)malloc(sizeof(struct Edge) * e);
600+ int *conne_gra = (int *)malloc(sizeof(int) * (v + 1));
601+
602+ // 初始化连通图数组,每个顶点初始时只与自己相连通
603+ for (int i = 0; i <= v; ++i)
604+ {
605+ conne_gra[i] = i;
606+ }
607+
608+ // 读取所有边的信息并存储到edg(存储所有边)数组中
609+ for (int i = 0; i < e; ++i)
610+ {
611+ scanf("%d%d%d", &v1, &v2, &val);
612+ edg[i].vex1 = v1;
613+ edg[i].vex2 = v2;
614+ edg[i].val = val;
615+ }
616+ bubblesort(edg, e); // 调用冒泡排序函数对边进行排序
617+
618+ // 遍历所有边,执行Kruskal算法来找到最小生成树
619+ for (int i = 0; i < e; ++i)
620+ {
621+ if (conne_gra[edg[i].vex1] != conne_gra[edg[i].vex2])
622+ { // 如果当前边的两个顶点不在同一个连通分量中
623+ int tmp1 = conne_gra[edg[i].vex1], tmp2 = conne_gra[edg[i].vex2];
624+ for (int k = 1; k <= v; ++k)
625+ { // 将所有属于tmp2的顶点合并到tmp1的连通分量中
626+ if (conne_gra[k] == tmp2)
627+ conne_gra[k] = tmp1;
628+ }
629+ ret += edg[i].val; // 将当前边的权重加到最小生成树的权重中
630+ }
631+ }
632+ printf("%d", ret);
633+ return 0;
634+ }
635+
636+ ```
0 commit comments