Advertisement
CooBin

pizza

Jul 19th, 2018
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.92 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long long ll;
  5. typedef pair<ll, int > pli;
  6.  
  7. void read(int &x) {
  8.     char c;
  9.     do { c = getchar(); } while (!isalnum(c));
  10.     x = c - '0';
  11.     while (isalnum(c = getchar())) x = x * 10 + c - '0';
  12. }
  13.  
  14. void write(string xx){ for (char c : xx) putchar(c); putchar('\n'); }
  15.  
  16. const int N = 100000 + 10;
  17. const int M = 200000 + 10;
  18. const ll inf = 1e16 + 7;
  19.  
  20. int n, m;
  21.  
  22. struct Edge{
  23.     int from, to, wei;
  24.     bool isOptimal;
  25.     int getNode(int x) { return x ^ from ^ to; }
  26.  
  27.     bool operator < (const Edge &X) const
  28.     { return from < X.from or (from == X.from and to < X.to) or (from == X.from and to == X.to and wei < X.wei); }
  29. } edg[2 * M];
  30. map<Edge, int > MapEdge;
  31.  
  32. vector<int > adj[N];
  33.  
  34. ll D[3][N];
  35. priority_queue<pli, vector<pli >, greater<pli > > PQ;
  36.  
  37. void djkstra(int start, char mode){
  38.     while (!PQ.empty()) PQ.pop();
  39.     PQ.push({0, start});
  40.  
  41.     for (int i = 1; i <= n; i++) D[start][i] = inf;
  42.     D[start][start] = 0;
  43.  
  44.     while (!PQ.empty()){
  45.         int u = PQ.top().second;
  46.         ll du = PQ.top().first;
  47.         PQ.pop();
  48.         if (du != D[start][u]) continue;
  49.  
  50.         for (int eid : adj[u]){
  51.             if (mode == 'N' && eid > m) continue;
  52.             if (mode == 'R' && eid <= m) continue;
  53.             int v = edg[eid].to;
  54.             ll ndu = du + 1LL * edg[eid].wei;
  55.             if (ndu < D[start][v]){
  56.                 D[start][v] = ndu;
  57.                 PQ.push({ndu, v});
  58.             }
  59.         }
  60.     }
  61. }
  62.  
  63. vector<ll > VX, VY;
  64.  
  65. void init_optimal(){
  66.     ll optimalWei = D[1][2];
  67.     for (int i = 1; i <= m; i++)
  68.     if (MapEdge[edg[i]] > 1) edg[i].isOptimal = 0;
  69.     else{
  70.         ll d1 = D[1][edg[i].from], d2 = D[2][edg[i].to];
  71.         if (d1 + d2 + edg[i].wei > optimalWei) {
  72.             edg[i].isOptimal = 0;
  73.             continue;
  74.         }
  75.         VX.push_back(d1);
  76.         VY.push_back(d1 + edg[i].wei);
  77.     }
  78.  
  79.     sort(VX.begin(), VX.end());
  80.     sort(VY.begin(), VY.end());
  81. }
  82.  
  83. void determine_optimal(){
  84.     for (int i = 1; i <= m; i++)
  85.     if (!edg[i].isOptimal) continue;
  86.     else{
  87.         ll X = D[1][edg[i].from], Y = X + edg[i].wei;
  88.         int numLess = upper_bound(VY.begin(), VY.end(), X) - VY.begin();
  89.         int numMore = VX.size() - ( lower_bound(VX.begin(), VX.end(), Y) - VX.begin() );
  90.         int numLeft = VX.size() - numMore - numLess - 1;
  91.         edg[i].isOptimal = (numLeft == 0);
  92.     }
  93. }
  94.  
  95. void init(){
  96.     djkstra(1, 'N');
  97.     djkstra(2, 'R');
  98.     init_optimal();
  99.     determine_optimal();
  100. }
  101.  
  102. void solve(){
  103.     for (int i = 1; i <= m; i++)
  104.         if (edg[i].isOptimal)
  105.             write("SAD");
  106.         else
  107.         if (D[1][edg[i].from] + edg[i].wei + D[2][edg[i].to] == D[1][2])
  108.             write("SOSO");
  109.         else
  110.         {
  111.             ll forcedBA = D[1][edg[i].to] + edg[i].wei + D[2][edg[i].from];
  112.             if (forcedBA < D[1][2]) write("HAPPY");
  113.             else write("SOSO");
  114.         }
  115. }
  116.  
  117. main(){
  118.     freopen("pizza.in", "r", stdin);
  119.     freopen("pizza.out", "w", stdout);
  120.     read(n), read(m);
  121.     for (int i = 1; i <= m; i++){
  122.         int u, v, w;
  123.         read(u), read(v), read(w);
  124.         edg[i] = {u, v, w, 1};
  125.         adj[u].push_back(i);
  126.         MapEdge[edg[i]]++;
  127.  
  128.         edg[i + m] = {v, u, w, 0};
  129.         adj[v].push_back(i + m);
  130.     }
  131.     init();
  132.     solve();
  133. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement