最小生成树的Kruskal算法(C/C++)--附有测试数据和结果
2010-04-29 18:26
453 查看
/* *算法原理:将图G 中的边按权数从小到大逐条考察, * 按不构成圈的原则加入到T中(若有选择时, 不同的选 * 择可能会导致最后生成树的权数不同), 直到 * q(T) = p(G)-1为止, 即 T 的边数 = G 的顶点1 为止. *算法中无圈性的判定比较麻烦,应该用标记法最好, *对各个分支的顶点标号。 *我没仔细看书,其实书上写得很清楚,是老师提醒的 ^_^ 。 *参考书:2004,《图论及其应用》,科学出版社,孙惠泉 编著。 */ #include<iostream> #include<fstream> #define N 100 using namespace std; int n;//结点数 int a = {0}; bool judgeNode(int flagNodes ){//判断是否还有未访问结点 for(int i = 0; i < n; i++) if(flagNodes[i] == 0) return 1; return 0; } void judgeSub(int flagSub , int x, int y){//标记分支 if(flagSub[x] != 0){ if(flagSub[y] == 0) flagSub[y] = flagSub[x]; else{ int min = flagSub[x] < flagSub[y] ? flagSub[x] : flagSub[y]; int max = flagSub[x] + flagSub[y] - min; for(int i = 0; i < n; i++) if(flagSub[i] == max) flagSub[i] = min; } } else{ if(flagSub[y] == 0){ int max = 0; for(int i = 0; i < n; i++){ if(flagSub[i] != 0 && flagSub[i] > max) max = flagSub[i]; } flagSub[x] = flagSub[y] = ++max; } else flagSub[x] = flagSub[y]; } } bool judgeCircle(int flagSub , int x, int y){//判断生成树中无圈 if(flagSub[x] == 0 && flagSub[y] == 0) return 1; if(flagSub[x] != flagSub[y]) return 1; return 0; } void kruskal(){ int temp = {0}; int flagNodes = {0}; int flagSub = {0}; int least = N; int x = 0, y = 0; cout<<"The edges of Optimal tree:"<<endl; while(judgeNode(flagNodes)){ least = N; for(int i = 0; i < n; i++){ for(int j = i+1; j < n; j++){ if(a[i][j] && a[i][j] < least && //关键的判断条件 judgeCircle(flagSub, i, j) && temp[i][j]==0){ least = a[i][j]; x = i, y = j; } } } cout<<"("<<x<<","<<y<<")-";//输出选取人权值最小的边 if(least < N){ flagNodes[x] = 1; flagNodes[y] = 1; judgeSub(flagSub, x, y); temp[x][y] = 1, temp[y][x] = 1; } } cout<<endl; //onput optimal tree cout<<"Optimal Tree in the Matrix:"<<endl; for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++) cout<<temp[i][j]<<" "; cout<<endl; } cout<<endl; } int main(){ ifstream in("kruskal.txt"); int nodes,entry; while(in>>n){ for(int i = 0; i < n; i++) for(int j = 0; j < n; j++) in>>a[i][j]; kruskal();//Kruskal函数 } return 0; } /* ////测试数据(kruskal.txt): 8 0 2 8 1 0 0 0 0 2 0 6 0 1 0 0 0 8 6 0 7 5 1 2 0 1 0 7 0 0 0 9 0 0 1 5 0 0 3 0 8 0 0 1 0 3 0 4 6 0 0 2 9 0 4 0 3 0 0 0 0 8 6 3 0 6 0 3 3 0 5 0 3 0 3 1 1 4 3 3 0 4 4 0 0 1 4 0 0 2 5 1 4 0 0 2 0 4 0 2 2 0 ////测试结果: The edges of Optimal tree: (0,3)-(1,4)-(2,5)-(0,1)-(2,6)-(4,5)-(6,7)- Optimal Tree in the Matrix: 0 1 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 The edges of Optimal tree: (1,3)-(1,4)-(3,5)-(0,1)-(0,2)- Optimal Tree in the Matrix: 0 1 1 0 0 0 1 0 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 */
相关文章推荐
- Pku acm 1861 NetWork 数据结构题目解题报告(二) ----最小生成树:prim算法&amp;amp;Kruskal算法
- 数据结构(C实现)------- 最小生成树之Kruskal算法
- mxnet 训练--如何生成rec 数据 +自己在本机测试的结果
- 数据结构之图---最小生成树Kruskal算法---C++实现
- 数据结构——邻接矩阵的最小生成树Kruskal算法
- 数据结构基础6.3:最小生成树MST(Prim、Kruskal)
- 动态生成表的测试数据
- Prim算法和Kruskal算法求最小生成树
- HDU 1102 Constructing Roads 最小生成树-Kruskal算法
- 最小生成树-Prim算法和Kruskal算法(转)
- Android 用ffmpeg生成Gif 各种排列组合的性能测试结果
- 最小生成树(prime算法、kruskal算法) 和 最短路径算法(floyd、dijkstra)
- Spoon-配合 Robotium 多设备分发测试,生成测试结果
- 最小生成树构造算法--Prim算法,Kruskal算法(C语言)
- 最小生成树算法——Prim和Kruskal算法的实现
- HDU 1233.还是畅通工程【最小生成树 kruskal算法(并查集)+prim算法】【1月8】
- 数据结构(五)--最小生成树(普利姆算法、克鲁斯卡尔算法)
- 九度 OJ 题目1144:Freckles (kruskal算法 最小生成树)
- Convnet中由输入图片测试数据并输出结果
- 最小生成树中的prim和kruskal算法