MST.cpp 540 B

12345678910111213141516171819202122
  1. // Using Union-find
  2. struct edge{ int u,v,w; };
  3. bool Kruskal_cmp(const edge *a, const edge *b) {
  4. return a->w<b->w;
  5. }
  6. // Return -1 if no tree found.
  7. int Kruskal(int n, int m, edge e[], int ret[]) {
  8. if(n==1) return 0;
  9. static edge *d[maxm];
  10. for(int i=0; i<m; i++) d[i] = e+i;
  11. sort(d, d+m, Kruskal_cmp);
  12. int f[maxn], c=0;
  13. make(f,i);
  14. for(int i=0, j=0; i<m; i++)
  15. if(find(f, d[i]->u) != find(f, d[i]->v)) {
  16. unite(f,d[i]->u,d[i]->v);
  17. c+=d[i]->w;
  18. ret[j]=d[i]-e;
  19. if(++j==n-1) return c;
  20. }
  21. return -1;
  22. }