Advertisement
he_obviously

Dijkstra

Apr 23rd, 2020
396
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.77 KB | None | 0 0
  1. //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,tune=native")
  2. //#pragma GCC optimize("unroll-loops")
  3. //#pragma GCC optimize("Ofast")
  4.  
  5. #include <bits/stdc++.h>
  6.  
  7. using namespace std;
  8.  
  9. typedef long long ll;
  10.  
  11. #define pb push_back
  12. #define pii pair<int, int>
  13. #define mp make_pair
  14. #define loop(i, n) for(int i = 0; i < (int)n; ++i)
  15. #define loop1(i, n) for(int i = 1; i <= (int)n; ++i)
  16. #define rloop(i, n) for (int i = (int)n; i >= 0; --i)
  17. #define F first
  18. #define S second
  19. #define sorted(a) sort(a.begin(), a.end())
  20.  
  21. const int INF = 2e9;
  22.  
  23. int main() {
  24.     ios::sync_with_stdio(0);
  25.     cin.tie(0); cout.tie(0);
  26.     int t;
  27.     cin >> t;
  28.     for (int test = 0; test < t; ++test) {
  29.         int n, m, c;
  30.         cin >> n >> m >> c;
  31.         vector <vector <pii>> v(n + 1);
  32.         for (int i = 0; i < m; ++i) {
  33.             int x, y, w;
  34.             cin >> x >> y >> w;
  35.             v[y].pb(mp(x, w));
  36.         }
  37.         vector <int> d(n + 1, INF);
  38.         d[c] = 0;
  39.         set <pii> q;
  40.         q.insert(mp(d[c], c));
  41.         while (!q.empty()) {
  42.             pii frnt = *q.begin();
  43.             int start = frnt.S;
  44.             q.erase(q.begin());
  45.             for (int i = 0; i < v[start].size(); ++i) {
  46.                 int g = v[start][i].F;
  47.                 int w = v[start][i].S;
  48.                 if (d[start] + w < d[g]) {
  49.                     q.erase(mp(d[g], g));
  50.                     d[g] = d[start] + w;
  51.                     q.insert(mp(d[g], g));
  52.                 }
  53.             }
  54.         }
  55.         int ans = 0, cnt = 0;
  56.         for (int i = 1; i <= n; ++i) {
  57.             if (d[i] < INF) {
  58.                 cnt += 1;
  59.                 ans = max(ans, d[i]);
  60.             }
  61.         }
  62.         cout << cnt << " " << ans << "\n";
  63.     }
  64.     return 0;
  65. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement