Advertisement
CooBin

pizza_verManh

Jul 19th, 2018
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.03 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define FOR(i, a, b)    for (int i = a; i <= b; ++i)
  3. #define ii              pair <int, int>
  4. #define int             long long
  5. using namespace std;
  6. const int N = 1e5 + 3, MOD = 1e9 + 21;
  7. int n, m;
  8. vector <ii> adj[N], rev[N];
  9. int d[3][N], num[3][N];
  10. priority_queue <ii, vector <ii>, greater <ii>> Q;
  11.  
  12. struct ds {
  13.     int u, v, w;
  14. };
  15. vector <ds> Edge;
  16.  
  17. void read(int &val) {
  18.     char c; do { c = getchar(); } while (! isdigit(c) && c != '-');
  19.     bool neg = c == '-'; val = neg ? 0 : c - '0';
  20.     while (isdigit(c = getchar())) val = 10 * val + c - '0';
  21.     val = neg ? - val : val;
  22. }
  23. void add(int &a, int b) { a = (a + b) % MOD; }
  24.  
  25. void dijk(int id, int st, vector <ii> adj[N]) {
  26.     d[id][st] = 0; num[id][st] = 1; Q.push({ 0, st });
  27.     while (Q.size()) {
  28.         int u = Q.top().second, du = Q.top().first;
  29.         Q.pop();
  30.         if (du != d[id][u]) continue;
  31.         for (ii it : adj[u]) {
  32.             int v = it.second, w = it.first;
  33.             if (d[id][v] > du + w) {
  34.                 d[id][v] = du + w, Q.push({ du + w, v });
  35.                 num[id][v] = num[id][u];
  36.             }
  37.             else if (d[id][v] == du + w) add(num[id][v], num[id][u]);
  38.         }
  39.     }
  40. }
  41.  
  42. main() {
  43.     ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  44.     freopen("pizza.in","r",stdin);
  45.     freopen("pizza.out","w",stdout);
  46.  
  47.     read(n), read(m);
  48.     FOR(i, 1, m) {
  49.         int u, v, w;
  50.         read(u), read(v), read(w);
  51.         Edge.push_back({ u, v, w });
  52.         adj[u].push_back({ w, v });
  53.         rev[v].push_back({ w, u });
  54.     }
  55.  
  56.     memset(d, 20, sizeof d);
  57.     dijk(1, 1, adj); dijk(2, 2, rev);
  58.  
  59.     for (auto it : Edge) {
  60.         int u = it.u, v = it.v, w = it.w;
  61.         ///cerr << u << ' ' << v << ' ' << w << '\n';
  62.         if (d[1][v] + w + d[2][u] < d[1][2]) {
  63.             puts("HAPPY"); continue;
  64.         }
  65.         if (d[1][u] + w + d[2][v] > d[1][2] || num[1][u] * num[2][v] % MOD != num[1][2]) {
  66.             puts("SOSO"); continue;
  67.         }
  68.         puts("SAD");
  69.     }
  70. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement