Kruskal算法是根据权来筛选节点,也是采用贪心算法。

/// Kruskal ///初始化每个节点为独立的点,他的祖先为自己本身 void made(int n) { for(int i=0; i<=n; i++) father[i]=i; ///father[i]存的父亲的编号 } ///找x这个点的祖先 int find(int x) { if(x!=father[x]) father[x]=find(father[x]); return father[x]; } ///按权的大小排序 int cmp(const void *a,const void *b) { tree *aa=(tree *)a; tree *bb=(tree *)b; return aa->val-bb->val; } ///参数n为节点个数,m为权的个数 bool kru(int n,int m) { int i,j; qsort(p,m,sizeof(p[0]),cmp); ans=0; made(n); int cnt=0; for(i=0;i<m;i++) { int xx=find(p[i].x); int yy=find(p[i].y); if(xx==yy) continue; father[yy]=xx; ans+=p[i].val; cnt++; } if(cnt!=n-1) return false; else return true; }