Advertisement
Guest User

Untitled

a guest
Oct 23rd, 2014
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.26 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. using namespace std;
  5.  
  6. class LN{
  7. private:
  8.     const static long long base = 1000000000000000;
  9.     const static int size = 2;
  10.    
  11.     bool cmp(const LN& a)const{
  12.         int k = size - 1;
  13.         while (k >= 0 && a.d[k] == 0 && d[k] == 0) k--;
  14.         if (k == -1) return false;
  15.         return d[k] < a.d[k];
  16.     }
  17.    
  18. public:
  19.     LN(){
  20.         sign = 0;
  21.         for (int i = 0; i < size; i++)
  22.             d[i] = 0;
  23.     }
  24.     LN(long long x){
  25.         if (x < 0){
  26.             sign = 1;
  27.             x = -x;
  28.         }
  29.         else sign = 0;
  30.        
  31.         for (int i = 0; i < size; i++)
  32.             d[i] = 0;
  33.         d[0] = x % base;
  34.         d[1] = x / base;
  35.     }
  36.     LN(const LN& x){
  37.         sign = x.sign;
  38.         for (int i = 0; i < size; i++)
  39.             d[i] = x.d[i];
  40.     }
  41.     LN operator + (const LN& a) const{
  42.         LN c;
  43.         if (sign == a.sign){
  44.             c.sign = sign;
  45.             for (long long i = 0, s = 0; i < size; i++){
  46.                 c.d[i] = d[i] + a.d[i] + s;
  47.                 s = c.d[i] / base;
  48.                 c.d[i] = c.d[i] % base;
  49.             }
  50.         }
  51.         else{
  52.             bool f = cmp(a);
  53.             if (f)
  54.                 c.sign = a.sign;
  55.             else
  56.                 c.sign = sign;
  57.             if (!f)
  58.                 for (long long i = 0, s = 0; i < size; i++){
  59.                     c.d[i] = d[i] - a.d[i] - s;
  60.                     s = 0;
  61.                     while (c.d[i] < 0){
  62.                         c.d[i] += base;
  63.                         s++;
  64.                     }
  65.                 }
  66.             else
  67.                 for (long long i = 0, s = 0; i < size; i++){
  68.                     c.d[i] = a.d[i] - d[i] - s;
  69.                     s = 0;
  70.                     while (c.d[i] < 0){
  71.                         c.d[i] += base;
  72.                         s++;
  73.                     }
  74.                 }
  75.         }
  76.         return c;
  77.     }
  78.     bool operator == (const LN& a)const {
  79.         int k = size - 1;
  80.         while (k >= 0 && a.d[k] == 0 && d[k] == 0) k--;
  81.         if (k == -1) return true;
  82.         if (sign != a.sign)
  83.             return false;
  84.         while (k >= 0){
  85.             if (d[k] != a.d[k]) return false;
  86.             k--;
  87.         }
  88.         return true;
  89.     }
  90.     bool operator < (const LN& a)const {
  91.         if ((*this) == a) return false;
  92.         if (sign != a.sign){
  93.             if (sign == 1) return true;
  94.             else return false;
  95.         }
  96.         bool f = cmp(a);
  97.         if (sign == 1)
  98.             return !f;
  99.         else
  100.             return f;
  101.     }
  102.     void print(){
  103.         int k = size - 1;
  104.         while (k >= 0 && d[k] == 0) k--;
  105.         if (k == -1){
  106.             cout << 0 << endl;
  107.             return;
  108.         }
  109.         if (sign) cout << '-';
  110.         printf("%lld", d[k]);
  111.         k--;
  112.         while (k >= 0){
  113.             printf("%09lld", d[k]);
  114.             k--;
  115.         }
  116.         cout << endl;
  117.     }
  118.    
  119.     static LN getINF(){
  120.         LN c;
  121.         for (int i = 0; i < size; i++)
  122.             c.d[i] = base - 1;
  123.         return c;
  124.     }
  125.    
  126.     int sign;
  127.     long long d[size];
  128. };
  129.  
  130. LN INF = LN::getINF();
  131.            
  132. int n, m, s;
  133. struct edge{
  134.     int from, to;
  135.     LN w;
  136. };
  137.  
  138. edge g[10000];
  139.  
  140. int main(){
  141.     cin >> n >> m >> s;
  142.     s--;
  143.     for (int i = 0; i < m; i++){
  144.         long long x, y, w;
  145.         cin >> x >> y >> w;
  146.         x--, y--,
  147.         g[i].from = x;
  148.         g[i].to = y;
  149.         g[i].w = LN(w);
  150.     }
  151.     random_shuffle(g, g + m);
  152.    
  153.     LN dist[10000], dist2[10000];
  154.     for (int i = 0; i < n; i++)
  155.         dist[i] = INF;
  156.     dist[s] = 0;
  157.    
  158.     for (int k = 0; k < n; k++)
  159.         for (int i = 0; i < m; i++)
  160.             if (dist[g[i].from] < INF)
  161.                 dist[g[i].to] = min(dist[g[i].to], dist[g[i].from] + g[i].w);
  162.    
  163.     for (int i = 0; i < n; i++)
  164.         dist2[i] = LN(dist[i]);
  165.        
  166.     for (int k = 0; k < n; k++)
  167.         for (int i = 0; i < m; i++)
  168.             if (dist[g[i].from] < INF)
  169.                 dist[g[i].to] = min(dist[g[i].to], dist[g[i].from] + g[i].w);
  170.    
  171.     for (int i = 0; i < n; i++)
  172.         if (dist[i] == INF)
  173.             cout << "*\n";
  174.         else if (dist[i] < dist2[i])
  175.             cout << "-\n";
  176.         else
  177.             dist[i].print();
  178.    
  179.    
  180.     return 0;
  181. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement