Guest User

Untitled

a guest
May 21st, 2018
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.10 KB | None | 0 0
  1. #include <cstdio>
  2. #include <iostream>
  3. #include <fstream>
  4. #include <cmath>
  5. #include <algorithm>
  6. #include <ctime>
  7. #include <cctype>
  8. #include <cstdlib>
  9. #include <cassert>
  10. #include <functional>
  11. #include <iomanip>
  12. #include <string>
  13. #include <cstring>
  14. #include <map>
  15. #include <set>
  16. #include <vector>
  17. #include <queue>
  18.  
  19. using namespace std;
  20.  
  21. int s, f;
  22.  
  23. vector <pair <int, int> > g[3000];
  24.  
  25. queue < pair<int, int> > bfs;
  26.  
  27. int used[3000];
  28.  
  29. int am[5000];
  30. int bm[5000];
  31. int rm[5000];
  32.  
  33. string d[3000];
  34.  
  35. int ans = 1e9;
  36.  
  37. string sum1(const string &a1, const string &b1)
  38. {
  39.         string a = a1;
  40.         string b = b1;
  41.        
  42.         int flag = 0;
  43.  
  44.         string s1 = "";
  45.  
  46.         while(a.size() != b.size())
  47.         {
  48.                 if(a.size() > b.size())
  49.                         b = '0' + b;
  50.                 else
  51.                         a = '0' + a;
  52.         }
  53.        
  54.         for(int i = 0; i <= a.size(); i++)
  55.                 s1 += '0';
  56.        
  57.         for(int i = max(a.size(), b.size()) - 1; i >= 0; i--)
  58.         {
  59.                 int a1, b1;
  60.                        
  61.                 a1 = int(a[i]) - int('0');
  62.                 b1 = int(b[i]) - int('0');
  63.                
  64.                 s1[i + 1] = char( ((a1 + b1 + flag) % 10) + '0' );
  65.                        
  66.                 //cerr << a1 << " " << b1 << " " << s1[i + 1] << endl;
  67.                        
  68.                 flag = (a1 + b1 + flag) / 10;
  69.                
  70.         }      
  71.        
  72.         s1[0] = char(flag + '0');
  73.        
  74.         //cerr << a << "+" << b << "=" << s1 << endl;
  75.         return s1;
  76. }
  77.  
  78. string sum(const string &a1, const string &b1)
  79. {
  80.    string a = a1;  
  81.     string b = b1;
  82.                
  83.     //длинное сложение
  84.     cerr << a << endl << b << endl;
  85.            
  86.     for(int i = 0; i < 3000; i++)
  87.     {
  88.         am[i] = 0;
  89.         bm[i] = 0;
  90.         rm[i] = 0;
  91.     }
  92.    
  93.     int u1 = 1;
  94.     int u2 = 1;
  95.    
  96.     if(a.size() > b.size())
  97.     {
  98.         int r = a.size() - b.size();
  99.        
  100.         u2 += r;
  101.     }
  102.    
  103.     if(a.size() < b.size())
  104.     {
  105.         int r = b.size() - a.size();
  106.        
  107.         u1 += r;
  108.     }
  109.  
  110.     //cerr << u1 << " " << u2 << endl;
  111.    
  112.     for(int i = u1; i < u1 + a.size(); i++)
  113.         am[i] = a[i - u1] - '0';
  114.    
  115.     for(int i = u2; i < u2 + b.size(); i++)
  116.         bm[i] = b[i - u2] - '0';
  117.    
  118.     for(int i = 0; i < 3000; i++)
  119.         rm[i] = am[i] + bm[i];
  120.    
  121.     for(int i = 3000; i > 0; i--)
  122.     {
  123.         if(rm[i] >= 10)
  124.         {
  125.             rm[i] -= 10;
  126.             rm[i - 1]++;
  127.         }
  128.     }
  129.        
  130.     string answer = "";
  131.    
  132.     for(int i = 0; i < u1 + a.size(); i++)
  133.         answer.push_back( char( int(rm[i]) + int('0') ) ); 
  134.    
  135.     cerr << answer << endl;
  136.        
  137.     return answer;
  138. }
  139.  
  140. string rec(int x)
  141. {
  142.     if(d[x] == "")
  143.     {
  144.    
  145.         if(x == s)
  146.         {
  147.             return("1");
  148.         }  
  149.  
  150.         string  res = "00000000";
  151.    
  152.         for(int i = 0; i < g[x].size(); i++)
  153.         {
  154.             if(used[g[x][i].first] == used[x] - g[x][i].second)
  155.             {
  156.                 //cerr << "(" << res << " "  << rec(g[x][i].first) << ")" << endl;
  157.                 res = sum(res, rec(g[x][i].first) );
  158.             }
  159.         }
  160.  
  161.         d[x] = res;
  162.         return res;
  163.     }
  164.     else
  165.         return(d[x]);
  166. }
  167. int main ()
  168. {
  169.                    
  170.    
  171.     int n, m;
  172.    
  173.     cin >> n >> m;
  174.    
  175.     for(int i = 0; i < 2000; i++)
  176.         used[i] = 1e8;
  177.    
  178.     for(int i = 0; i < m; i++)
  179.     {
  180.         int a, b, c;
  181.         scanf("%d%d%d", &a, &b, &c);
  182.        
  183.         g[a].push_back(make_pair(b, c));
  184.         g[b].push_back(make_pair(a, c));
  185.     }
  186.    
  187.     cin >> s >> f;
  188.    
  189.     bfs.push( make_pair(s, 0) );
  190.     used[s] = 0;
  191.    
  192.     while(!bfs.empty())
  193.     {
  194.         pair<int, int> t;
  195.        
  196.         t = bfs.front();
  197.        
  198.         if(t.first == f)
  199.         {
  200.             ans = min(ans, t.second);
  201.         }
  202.        
  203.         bfs.pop();
  204.        
  205.         for(int i = 0; i < g[t.first].size(); i++)
  206.         {
  207.             if(used[ g[t.first][i].first ] > t.second + g[t.first][i].second)
  208.             {
  209.                 bfs.push(make_pair(g[t.first][i].first, g[t.first][i].second + t.second));
  210.                
  211.                 used[g[t.first][i].first] = g[t.first][i].second + t.second;
  212.             }
  213.         }
  214.    
  215.     }
  216.     //for(int i = 0; i < 2000; i++)
  217.     //  used[i] = 0;
  218.    
  219.     if(ans == 1e9)
  220.     {
  221.         cout << 0;
  222.         return 0;
  223.     }
  224.    
  225.     int flag = 0;
  226.     //return 0;
  227.    
  228.     string answer = rec(f);
  229.    
  230.     for(int i = 0; i < answer.size(); i++)
  231.     {
  232.         if(flag == 0 && answer[i] != '0')
  233.         {
  234.             flag = 1;
  235.         }
  236.    
  237.         if(flag == 1)
  238.             cout << answer[i];
  239.     }
  240.    
  241.     //cout << rec(f);
  242.    
  243.     return 0;
  244. }
Add Comment
Please, Sign In to add comment