kruskal 求最小生成树(MST) 模板
/******************Kruskal********************/ #include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int V = 101; int father[V],map[V][V]; struct point { int s,v,rank; }p[V*V]; int cmp(point a, point b) { return a.rank<b.rank; } int find(int x) //O(n) { if(x!=father[x]) father[x]=find(father[x]); return father[x]; } void Union(int a,int b) //O(n) { int x = find(a); int y = find(b); if(x==y) return ; father[y]=x; } bool found(int n) //O(n) { int x=find(0); for(int i=0;i<n;i++) if(find(i)!=x) return false; return true; } int kruskal(int map[][V],int n) //O(n^3)? { int i,j,cnt,mst=0; for(i=0,cnt=0;i<n;i++) { father[i]=i; for(j=0;j<n;j++) { p[cnt].s=i; p[cnt].v=j; p[cnt].rank = map[i][j]; cnt++; } } sort(p,p+n*n,cmp); //O(E*logE) E=n^2 for(i=0;i<n*n;i++) { if(p[i].rank!=0) { if(find(p[i].s)!=find(p[i].v)) mst+=p[i].rank; Union(p[i].s,p[i].v); if(found(n)==true) return mst; } } } int main() { // freopen("in.txt","r",stdin); int n; scanf("%d",&n); int m,i,j,p,q,cnt=0; memset(map,0,sizeof(map)); for(i=0;i<n;i++) for(j=0;j<n;j++) scanf("%d",&map[i][j]); // 输入一个邻接矩阵 cout<<kruskal(map,n)<<endl; return 0; } 调用函数时......map[][v]是邻接矩阵 , n是矩阵的宽度 下面是吉林大学的prim最小生成树模版...以前都是用这个的...也比较好用 /***********************Prim 求MST******************************/ const int inf = 0x3f3f3f3f; int vis[V],lowc[V]; int prim(int cost[][V], int n) // vertex: 0 ~ n-1 { int i, j, p,minc, res = 0; memset(vis, 0, sizeof(vis)); vis[0] = 1; for (i=1; i<n; i++) lowc[i] = cost[0][i]; for (i=1; i<n; i++) { minc = inf; p = -1; for (j=0; j<n; j++) if (0 == vis[j] && minc > lowc[j]) minc = lowc[j]; p = j; if (inf == minc) return -1; // 原图不连通 res += minc; vis[p] = 1; for (j=0; j<n; j++) if (0 == vis[j] && lowc[j] > cost[p][j]) lowc[j] = cost[p][j]; } return res; }