Advertisement
Okorosso

G8: SST for sparse graph

Jul 1st, 2021
679
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.82 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <vector>
  4. #include <set>
  5. #include <queue>
  6.  
  7. #define INF 100000001
  8.  
  9. using namespace std;
  10. int n;
  11.  
  12. void dfs(vector<vector<pair<int, int>>> &g, vector<bool> &visited, int v) {
  13.     visited[v] = true;
  14.     for (int i = 0; i < g[v].size(); i++)
  15.         if (!visited[g[v][i].first])
  16.             dfs(g, visited, g[v][i].first);
  17. }
  18.  
  19.  
  20. void Prima(vector<vector<pair<int, int>>> &g, ofstream &fout) {
  21.     vector<bool> visited(n, false);
  22.     vector<int> min(n, INF);
  23.     min[0] = 0;
  24.     set<pair<int, int>> q;
  25.     int count = 0;
  26.     q.insert(pair<int, int>(0, 0));
  27.     while (!q.empty()) {
  28.         int v = q.begin()->second;
  29.         q.erase(q.begin());
  30.         for (int j = 0; j < g[v].size(); j++) {
  31.             if (!visited[g[v][j].first] && g[v][j].second < min[g[v][j].first]) {
  32.                 q.erase(pair<int, int>(min[g[v][j].first], g[v][j].first));
  33.                 min[g[v][j].first] = g[v][j].second;
  34.                 q.insert(pair<int, int>(min[g[v][j].first], g[v][j].first));
  35.             }
  36.  
  37.         }
  38.         visited[v] = true;
  39.         count += min[v];
  40.     }
  41.     fout << count;
  42. }
  43.  
  44. int main() {
  45.  
  46.     ifstream fin("input.txt");
  47.     ofstream fout("output.txt");
  48.  
  49.     int m;
  50.     fin >> n >> m;
  51.     vector<vector<pair<int, int>>> g(n);
  52.  
  53.     int tmpV1, tmpV2, weight;
  54.  
  55.     for (int i = 0; i < m; i++) {
  56.         fin >> tmpV1 >> tmpV2 >> weight;
  57.         g[tmpV1 - 1].push_back(pair<int, int>(tmpV2 - 1, weight));
  58.         g[tmpV2 - 1].push_back(pair<int, int>(tmpV1 - 1, weight));
  59.     }
  60.  
  61.     vector<bool> visited(n, false);
  62.     dfs(g, visited, 0);
  63.     for (int i = 0; i < visited.size(); i++) {
  64.         if (!visited[i]) {
  65.             fout << -1;
  66.             return 0;
  67.         }
  68.     }
  69.     Prima(g, fout);
  70.  
  71.     fin.close();
  72.     fout.close();
  73.     return 0;
  74. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement