最小生成树(Kruskal算法并查集优化)学习总结


//
在学习最小生成树时,我刚接触的是并不是Kruskal算法,而是prim算法,prim算法的代码将在以后的随笔中给出。 //我的第一个并查集的程序就是最小生成树Kruskal算法,我个人觉得并查集是个好东西下面就是我给出的题目描述和代码。 //[题目描述] // 输入n,m,n代表村子的数目,m表示村子之间路的条数,接下来m行,没行三个整数,x,y,d,起始位置,和这两个村子的距离, //输出联通所有村子的最小路径。 //样例输入 //5 7 //1 5 23 //1 4 5 //1 2 17 //2 4 10 //2 3 30 //3 4 24 //3 5 7 //样例输出 //45 #include <iostream> #include <cstdlib> using namespace std; const int maxn = 100000; class Kruskal { public: int from,to,dis; }; int father [maxn] = {0}; Kruskal p[maxn]; int cmp (const void *a,const void *b) { Kruskal *A = (Kruskal *)a; Kruskal *B = (Kruskal *)b; return A->dis - B->dis; } int find (int i) { if (father[i] == 0) return i; if (father[father[i]] == 0) return father[i]; int pos = find (father[i]); father [i] = pos; return pos; } int main () { int n,m,x,y; cin >> n >> m; for (int i = 0;i < m; i++) { cin >> p[i].from >> p[i].to >> p[i].dis; } qsort(p,m,sizeof(p[0]),cmp); int ans = 0; for (int i = 0;i < m; i++) { x = find (p[i].from); y = find (p[i].to); if (x != y) { father[x] = y; ans += p[i].dis; } } cout << ans << endl; }

 

posted @ 2014-02-13 17:28  闪光阳  阅读(1315)  评论(0编辑  收藏  举报