Example #1
0
//use union find and skew tree
Graph* Tree::Kruskal(Graph* g){
  Skew* C = new Skew();
  Set* Cyc = new Set(g->size);
  int final[g->size][g->size];
  int n = g->size * g->size;
  int count = 0;
  for(int i = 0; i < g->size; i++)
  {
    for(int j = 0; j < g->size; j++)
    {
      final[i][j] = 0;
      if(g->edges[i][j] != 0)
      {
        int cost = g->edges[i][j];
        g->edges[j][i] = 0;
        Node* n = new Node();
        n->edge[0] = i;
        n->edge[1] = j;
        n->value = cost;
        C->insert(n, C->root);
      }
    }
  }
  while(C->root != nullptr && count <n-1)
  {
    Node* x = C->root;
    C->deleteMin(C->root);
    int v = x->edge[0];
    int w = x->edge[1];
    int fv = Cyc->find(x->edge[0]);
    int fw = Cyc->find(x->edge[1]);
    if(fv != fw)
    {
      final[v][w] == 1;
      final[w][v] == 1;
      Cyc->Sunion(v, w);
    }
  }