1. /*
    2. kruskal 算法:每次选择最短的一条边加入集合,直至所有顶点被包含,而且会用到并查集
    3. */
    4. #include<stdio.h>
    5. #include <stdlib.h>
    6. #define MAXSIZE 100
    7. #define TYPE int
    8. typedef struct EdgeNode {//边表结点
    9. int index;//该边所指向的顶点的位置
    10. int weight;//权值
    11. EdgeNode *next;//下一个邻接边
    12. }EdgeNode;
    13. typedef struct VertexNode {//顶点表节点
    14. char info;//顶点信息
    15. EdgeNode *firstEdge;//指向第一条依附该顶点的边的指针
    16. }VertexNode, Adjlist[MAXSIZE];
    17. typedef struct {
    18. Adjlist adjlist;//顶点数组
    19. int numE, numV;//边数、顶点数
    20. }ALGraph;
    21. struct Tree {
    22. char data;
    23. struct Tree *lchild, *rchild;
    24. };
    25. void outPut(ALGraph *G, int **weights) {//输出最小生成树
    26. for (int i = 0; i < G->numV; i++) {
    27. for (int j = i; j < G->numV; j++) {
    28. if (weights[i][j] != 0) {
    29. printf("%c->%c(%d)\n", G->adjlist[i].info, G->adjlist[j].info, weights[i][j]);
    30. }
    31. }
    32. }
    33. }
    34. int findAnster(int *fa, int i) {
    35. if (fa[i] == i)return i;//找到返回
    36. else {
    37. fa[i] = findAnster(fa, fa[i]);//进行路径压缩,即将i处
    38. return fa[i];//未找到继续
    39. }
    40. }
    41. void unionn(int *fa, int i, int j) {
    42. int i_a = findAnster(fa, i);
    43. int j_a = findAnster(fa, j);
    44. fa[i_a] = j_a;//i的祖先指向j的祖先
    45. }
    46. void kruskal(ALGraph *G) {
    47. int **weights = (int **)malloc(sizeof(int *)*G->numV);//两点间的权值数据
    48. int *fa = (int *)malloc(sizeof(int)*G->numV);//并查集数组
    49. for (int i = 0; i < G->numV; i++) {
    50. fa[i] = i;//最开始将每个节点的祖先设置为自己
    51. }
    52. for (int i = 0; i < G->numV; i++) {
    53. weights[i] = (int *)malloc(sizeof(int *)*G->numV);
    54. }
    55. for (int i = 0; i < G->numV; i++) {
    56. for (int j = 0; j < G->numV; j++) {
    57. weights[i][j] = 0;//初始化该二位数组
    58. }
    59. }
    60. int edges = 0;
    61. while (edges < G->numV - 1) {
    62. int weight = 32767;
    63. int start, end;
    64. for (int i = 0; i < G->numV; i++) {//遍历每一个顶点的所有边
    65. for (EdgeNode *p = G->adjlist[i].firstEdge; p; p = p->next) {
    66. //寻找最短边
    67. if (p->weight < weight && findAnster(fa, i) != findAnster(fa, p->index)) {
    68. weight = p->weight;
    69. start = i;
    70. end = p->index;
    71. }
    72. }
    73. }
    74. unionn(fa, start, end);
    75. weights[start][end] = weight;
    76. weights[end][start] = weight;
    77. edges++;
    78. }
    79. outPut(G, weights);
    80. }
    81. int main() {
    82. ALGraph *G = (ALGraph *)malloc(sizeof(ALGraph *));
    83. void createGraphInFile(ALGraph *);
    84. void dispGraph(ALGraph *);
    85. createGraphInFile(G);//创建图
    86. dispGraph(G);
    87. kruskal(G);
    88. return 0;
    89. }