Advertisement
tien_noob

Minimum Spanning Tree (Both Prim and Kruskal)

May 24th, 2021 (edited)
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.95 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define TASK "MST"
  3. using namespace std;
  4. const int N = 1e5;
  5. const long long oo = 1e18;
  6. struct TEdge
  7. {
  8.     int u, v;
  9.     long long w;
  10.     bool select;
  11. };
  12. using PEdge = TEdge* ;
  13. TEdge a[N + 1];
  14. PEdge p[N + 1];
  15. vector<PEdge> Adj[N + 1];
  16. int n, m, k;
  17. void read()
  18. {
  19.    cin >> n >> m;
  20.    k = 0;
  21.    for (int i = 1; i <= m; ++ i)
  22.    {
  23.        cin >> a[i].u >> a[i].v >> a[i].w;
  24.        a[i].select = false;
  25.        //Kruskal : p[i] = &a[i];
  26.        /*Prim
  27.        Adj[a[i].u].push_back(&a[i]);
  28.        Adj[a[i].v].push_back(&a[i]); */
  29.    }
  30. }
  31. // Kruskal starts from here
  32. int lab[N + 1];
  33. bool LF(PEdge x, PEdge y)
  34. {
  35.     return x->w < y->w;
  36. }
  37. void Unite(int r, int s)
  38. {
  39.     if (lab[s] <  lab[r])
  40.     {
  41.         swap(r, s);
  42.     }
  43.     lab[r] += lab[s];
  44.     lab[s] = r;
  45. }
  46. int FindSet(int u)
  47. {
  48.     if (lab[u] < 0)
  49.     {
  50.         return u;
  51.     }
  52.     return lab[u] = FindSet(lab[u]);
  53. }
  54. void Kruskal()
  55. {
  56.     long long sum = 0;
  57.     memset(lab, -1, sizeof(lab));
  58.     sort(p + 1, p + m + 1, LF);
  59.     for (int i = 1; i <= m; ++ i)
  60.     {
  61.         int r = FindSet(p[i]->u), s = FindSet(p[i]->v);
  62.         if (r != s)
  63.         {
  64.             ++k;
  65.             Unite(r, s);
  66.             sum += p[i]->w;
  67.             p[i]->select = true;
  68.         }
  69.     }
  70.     if (k == n - 1)
  71.     {
  72.         cout << sum;
  73.     }
  74.     else
  75.     {
  76.         cout << "DISCONNECTED";
  77.     }
  78. }
  79. //Prim starts from here
  80. long long d[N + 1];
  81. bool InTree[N + 1];
  82. PEdge Trace[N + 1];
  83. struct TPQItem
  84. {
  85.     int node;
  86.     long long dlab;
  87.     bool operator < (const TPQItem & other) const
  88.     {
  89.         return other.dlab < dlab;
  90.     }
  91.     bool Valid()
  92.     {
  93.         return d[node] == dlab;
  94.     }
  95. };
  96. priority_queue<TPQItem> PQ;
  97. void Prim()
  98. {
  99.    fill(d + 1, d + n + 1, oo);
  100.    fill(InTree + 1, InTree + n + 1, false);
  101.    d[1] = 0;
  102.    PQ.push({1, 0LL});
  103.    while (!PQ.empty())
  104.    {
  105.        TPQItem r = PQ.top();
  106.        PQ.pop();
  107.        if (!r.Valid())
  108.        {
  109.            continue;
  110.        }
  111.        int u = r.node;
  112.        InTree[u] = true;
  113.        ++k;
  114.        for (PEdge p : Adj[u])
  115.        {
  116.            int v = p->u ^ p->v ^ u; // The other note except u (Spy detected)
  117.            if (!InTree[v] && d[v] > p->w)
  118.            {
  119.                d[v] = p->w;
  120.                Trace[v] = p;
  121.                PQ.push({v, d[v]});
  122.            }
  123.        }
  124.    }
  125.    if (k != n)
  126.    {
  127.        cout << "DISCONNECTED";
  128.    }
  129.    else
  130.    {
  131.        long long sum = 0;
  132.        for (int i = 2; i <= n; ++ i)
  133.        {
  134.            PEdge p = Trace[i];
  135.            sum += p-> w;
  136.        }
  137.        cout << sum;
  138.    }
  139. }
  140. void solve()
  141. {
  142.    //Kruskal();
  143.    //Prim();
  144. }
  145. int main()
  146. {
  147.    ios_base::sync_with_stdio(false);
  148.    cin.tie(nullptr);
  149.    freopen(TASK".INP", "r", stdin);
  150.    freopen(TASK".OUT", "w", stdout);
  151.    int t = 1;
  152.    bool typetest = false;
  153.    if (typetest)
  154.    {
  155.       cin >> t;
  156.    }
  157.    for (int __ = 1; __ <= t; ++ __)
  158.    {
  159.       read();
  160.       solve();
  161.    }
  162. }
  163.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement