数据结构之n--n(kruskal算法)
来源:互联网 发布:凸优化 清华大学 pdf 编辑:程序博客网 时间:2024/06/05 13:14
上代码:如果有疑问的话,欢迎随时留言!
- #include <stdio.h>
-
-
-
-
-
-
- #define ENUM 15//边的数量
- #define VNUM 9//顶点的数量
- #define MV 0
-
- typedef struct _tag_Edge
- {
- int begin;
- int end;
- int weight;
- }Edge;
-
- int father[VNUM];
- int son[VNUM];
- int Matvix[VNUM][VNUM]=
- {
- {0, 10, MV, MV, MV, 11, MV, MV, MV},
- {10, 0, 18, MV, MV, MV, 16, MV, 12},
- {MV, 18, 0, 22, MV, MV, MV, MV, 8},
- {MV, MV, 22, 0, 20, MV, 24, 16, 21},
- {MV, MV, MV, 20, 0, 26, MV, 7, MV},
- {11, MV, MV, MV, 26, 0, 17, MV, MV},
- {MV, 16, MV, 24, MV, 17, 0, 19, MV},
- {MV, MV, MV, 16, 7, MV, 19, 0, MV},
- {MV, 12, 8, 21, MV, MV, MV, MV, 0},
- };
-
- void swap(Edge array[], int i, int j)
- {
- Edge temp = array[i];
- array[i] = array[j];
- array[j] = temp;
- }
-
- void SelectionSort(Edge array[], int len)
- {
- int i = 0;
- int j = 0;
- int k = -1;
-
- for(i=0; i<len; i++)
- {
- k = i;
- for(j=i; j<len; j++)
- {
- if( array[j].weight < array[k].weight )
- {
- k = j;
- }
- }
- swap(array, i, k);
- }
- }
-
- int unionsearch(int x)
- {
- if(x != father[x])
- {
- father[x] = unionsearch(father[x]);
- }
-
- return father[x];
- }
-
- int join(int x, int y)
- {
- int root1, root2;
- root1 = unionsearch(x);
- root2 = unionsearch(y);
- if(root1 == root2)
- return 0;
- else
- {
- father[root1] = root2;
- son[root2] += son[root1];
- }
-
- return 1;
- }
-
- int main()
- {
- int i, j;
- int total = 0;
- int sum = 0;
- int flag = 0;
- int eNUM = ENUM-1;
-
- Edge array[ENUM];
-
- for(i=0; i<VNUM; ++i)
- {
- father[i] = i;
- son[i] = 1;
- }
-
- for(i=0; i<VNUM; i++)
- {
- for(j=0; j<VNUM; j++)
- {
- if((i<j) && (0 < Matvix[i][j]))
- {
- array[eNUM].begin = i;
- array[eNUM].end = j;
- array[eNUM--].weight= Matvix[i][j];
- }
- }
- }
-
-
- SelectionSort(array, ENUM);
-
- for(i=0; i<ENUM; i++)
- {
- if(join(array[i].begin, array[i].end))
- {
- total++;
- sum += array[i].weight;
- printf("%d -> %d weight:%d\n", array[i].begin, array[i].end, array[i].weight);
- }
- if(total == VNUM-1)
- {
- flag = 1;
- break;
- }
- }
- if(flag)
- printf("%d\n", sum);
- else
- printf("error.\n");
-
- return 0;
- }