giabinh

Prim

Nov 2nd, 2015
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.19 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define maxN 105
  4. #define INF 1000000007
  5.  
  6. using namespace std;
  7.  
  8. vector < pair<int, int> > ke[maxN];
  9. int n, m, s, ans = 0, d[maxN], trace[maxN];
  10. bool visited[maxN];
  11.  
  12. void prim() {
  13.     set < pair<int, int> > q;
  14.     q.insert(make_pair(0, s));
  15.     memset(d, INF, sizeof d); d[s] = trace[s] = 0;
  16.     visited[s] = true;
  17.  
  18.     while (!q.empty())
  19.     {
  20.         pair <int, int> top = *(q.begin()); q.erase(top);
  21.         int u = top.second;
  22.         ans += top.first;
  23.         visited[u] = true;
  24.         for (int i=0; i<ke[u].size(); ++i)
  25.         {
  26.             int v = ke[u][i].first, w = ke[u][i].second;
  27.             if (!visited[v] && d[v] > w)
  28.             {
  29.                 q.erase(make_pair(d[v], v));
  30.                 d[v] = w;
  31.                 q.insert(make_pair(d[v], v));
  32.                 trace[v] = u;
  33.             }
  34.         }
  35.     }
  36. }
  37.  
  38. int main() {
  39.     freopen("Prim.inp", "r", stdin);
  40.  
  41.     scanf("%d%d%d", &n, &m, &s);
  42.     for (int i=0; i<m; ++i)
  43.     {
  44.         int u, v, w;
  45.         scanf("%d%d%d", &u, &v, &w);
  46.         ke[u].push_back(make_pair(v, w));
  47.         ke[v].push_back(make_pair(u, w));
  48.     }
  49.  
  50.     prim();
  51.     cout << ans;
  52.  
  53.     return 0;
  54. }
Advertisement
Add Comment
Please, Sign In to add comment