Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define FOR(i, a, b) for (int i = a; i <= b; ++i)
- #define ii pair <int, int>
- #define int long long
- using namespace std;
- const int N = 1e5 + 3, MOD = 1e9 + 21;
- int n, m;
- vector <ii> adj[N], rev[N];
- int d[3][N], num[3][N];
- priority_queue <ii, vector <ii>, greater <ii>> Q;
- struct ds {
- int u, v, w;
- };
- vector <ds> Edge;
- void read(int &val) {
- char c; do { c = getchar(); } while (! isdigit(c) && c != '-');
- bool neg = c == '-'; val = neg ? 0 : c - '0';
- while (isdigit(c = getchar())) val = 10 * val + c - '0';
- val = neg ? - val : val;
- }
- void add(int &a, int b) { a = (a + b) % MOD; }
- void dijk(int id, int st, vector <ii> adj[N]) {
- d[id][st] = 0; num[id][st] = 1; Q.push({ 0, st });
- while (Q.size()) {
- int u = Q.top().second, du = Q.top().first;
- Q.pop();
- if (du != d[id][u]) continue;
- for (ii it : adj[u]) {
- int v = it.second, w = it.first;
- if (d[id][v] > du + w) {
- d[id][v] = du + w, Q.push({ du + w, v });
- num[id][v] = num[id][u];
- }
- else if (d[id][v] == du + w) add(num[id][v], num[id][u]);
- }
- }
- }
- main() {
- ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
- freopen("pizza.in","r",stdin);
- freopen("pizza.out","w",stdout);
- read(n), read(m);
- FOR(i, 1, m) {
- int u, v, w;
- read(u), read(v), read(w);
- Edge.push_back({ u, v, w });
- adj[u].push_back({ w, v });
- rev[v].push_back({ w, u });
- }
- memset(d, 20, sizeof d);
- dijk(1, 1, adj); dijk(2, 2, rev);
- for (auto it : Edge) {
- int u = it.u, v = it.v, w = it.w;
- ///cerr << u << ' ' << v << ' ' << w << '\n';
- if (d[1][v] + w + d[2][u] < d[1][2]) {
- puts("HAPPY"); continue;
- }
- if (d[1][u] + w + d[2][v] > d[1][2] || num[1][u] * num[2][v] % MOD != num[1][2]) {
- puts("SOSO"); continue;
- }
- puts("SAD");
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement