POJ 1861 Network [最小生成树算法MST-kruskal 数据结构-并查集 union-find sets]

跟这个prim算法最小生成树http://blog.csdn.net/hzyhouzhiyuan/archive/2011/01/23/6159382.aspx,

两个算法,邻接矩阵存图时,prim适用于稠密图,kruskal适于用稀疏图。

代码还是比较清晰明了的,输入所有边,进行排序,贪心+并查集求出MST。

#include #include #include using namespace std; const int MAXSIZE = 1050; int rank[MAXSIZE]; // 节点高度的上界 int parent[MAXSIZE]; // 根节点 int FindSet(int x){// 查找+递归的路径压缩 if( x != parent[x] ) parent[x] = FindSet(parent[x]); return parent[x]; } void Union(int root1, int root2){ int x = FindSet(root1), y = FindSet(root2); if( x == y ) return ; if( rank[x] > rank[y] ) parent[y] = x; else{ parent[x] = y; if( rank[x] == rank[y] ) ++rank[y]; } } void Initi(int n){ memset(rank, 0, sizeof(rank)); for( int i=0; i <=n; ++i ) parent[i] = i; } struct hubconnect{ int a,b; int len; bool flag; }hubconnects[15005]; bool cmp(hubconnect h1,hubconnect h2) {return h1.len= n-1) break; } } printf("%d/n%d/n",maxlen,mycount); int i=0; while(mycount) { if(hubconnects[i].flag) { printf("%d %d/n",hubconnects[i].a,hubconnects[i].b); mycount--; } i++; } } 

你可能感兴趣的:(图论,数据结构,常用算法代码)