Advertisement
double_trouble

Untitled

Oct 27th, 2014
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.80 KB | None | 0 0
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <cstring>
  4. #include <string>
  5. #include <algorithm>
  6. #include <queue>
  7. #include <vector>
  8. #include <cstdlib>
  9. #include <fstream>
  10. #include <ctime>
  11. #include <climits>
  12.  
  13. using namespace std;
  14.  
  15. #define F first
  16. #define S second
  17.  
  18. long long a[3000][3000], fl[3000], pr[3000], d[3000], d1[3000], d2[3000], l[3000];
  19.  
  20.  
  21. int main()
  22. {
  23.     ios_base::sync_with_stdio(0); //dear Satan, help me please ^_^
  24.     freopen("input.txt", "r", stdin); //о, великий компилятор, призываю тебя, сжалься!!
  25.     freopen("output.txt", "w", stdout); //гспд, дай мозгов
  26.     int n,m; // aaaa schito ne tak?!
  27.     cin>>n>>m; //pol'zuyas' sluchaem peredayu privet mame i pape
  28.     for (int i=0; i<n; i++) //Artur  ty nos
  29.         for (int j=0; j<n; j++) //lel
  30.         a[i][j] = INT_MAX/2; //kogo nado ubit', chtoby ono zashlo?
  31.     int x,y,z;
  32.     for (int i=0; i<m; i++)
  33.     {
  34.         cin>>x>>y>>z;
  35.         x--;
  36.         y--;
  37.         a[x][y] = z;
  38.         a[y][x] = z;
  39.     }
  40.     for (int i=0; i<n; i++)
  41.         a[i][i] = 0;
  42.     int k;
  43.     cin>>k;
  44.     int s,f,v;
  45.     cin>>s>>f>>v;
  46.     s--;
  47.     f--;
  48.     v--;
  49.     for (int i=0; i<n; i++)
  50.         {
  51.             d[i] = a[s][i];
  52.             fl[i] = 0;
  53.             pr[i] = -1;
  54.         }
  55.     pr[s] = 0;
  56.     fl[s] = 1;
  57.     int minn, mn, p;
  58.     p = s;
  59.     for (int i=0; i<n-1; i++)
  60.     {
  61.  
  62.         minn = INT_MAX/2;
  63.         mn=0;
  64.         for (int j=0; j<n; j++)
  65.             if (fl[j] == 0 && d[j]<minn)
  66.         {
  67.             minn = d[j];
  68.             mn = j;
  69.         }
  70.  
  71.         p = mn;
  72.         fl[mn] = 1;
  73.         for (int j=0; j<n; j++)
  74.             if (fl[j] == 0 && d[p]+a[p][j]<d[j])
  75.             {
  76.                 d[j] = d[p] + a[p][j];
  77.                 pr[j] = p;
  78.             }
  79.     }
  80.    // for (int i=0; i<n; i++)
  81.     //    cout<<d[i]<<" ";
  82.     //cout<<endl;
  83.     int r = d[f];
  84.     int g = d[v];
  85.     int j=v;
  86.     y = 1;
  87.     l[0] = v;
  88.     while (pr[j] > 0)
  89.     {
  90.         l[y] = pr[j];
  91.         //cout<<l[y]<<" ";
  92.         j = pr[j];
  93.         y++;
  94.     }
  95.     l[y] = s;
  96.  
  97.    // for (int i=0; i<=y; i++)
  98.      //   cout<<l[i]<<" ";
  99.     //cout<<endl;
  100.  
  101.    for (int i=0; i<n; i++)
  102.         {
  103.             d1[i] = a[f][i];
  104.             fl[i] = 0;
  105.             pr[i] = -1;
  106.         }
  107.     pr[f] = 0;
  108.     fl[f] = 1;
  109.     p = f;
  110.     for (int i=0; i<n-1; i++)
  111.     {
  112.         minn = INT_MAX/2;
  113.         mn=0;
  114.         for (int j=0; j<n; j++)
  115.             if (fl[j] == 0 && d1[j]<minn)
  116.         {
  117.             minn = d1[j];
  118.             mn = j;
  119.         }
  120.         p = mn;
  121.         fl[mn] = 1;
  122.         for (int j=0; j<n; j++)
  123.             if (fl[j] == 0 && d1[p]+a[p][j]<d1[j])
  124.             {
  125.                 d1[j] = d1[p] + a[p][j];
  126.                 pr[j] = p;
  127.             }
  128.     }
  129.     for (int i=0; i<n; i++)
  130.         {
  131.             d2[i] = a[v][i];
  132.             fl[i] = 0;
  133.             pr[i] = -1;
  134.         }
  135.     pr[v] = 0;
  136.     fl[v] = 1;
  137.     p = v;
  138.     for (int i=0; i<n-1; i++)
  139.     {
  140.         minn = INT_MAX/2;
  141.         mn=0;
  142.         for (int j=0; j<n; j++)
  143.             if (fl[j] == 0 && d2[j]<minn)
  144.         {
  145.             minn = d2[j];
  146.             mn = j;
  147.         }
  148.         p = mn;
  149.         fl[mn] = 1;
  150.         for (int j=0; j<n; j++)
  151.             if (fl[j] == 0 && d2[p]+a[p][j]<d2[j])
  152.             {
  153.                 d2[j] = d2[p] + a[p][j];
  154.                 pr[j] = p;
  155.             }
  156.     }
  157.     int ans = g;
  158.    // for (int i=0; i<=y; i++)
  159.      //   cout<<l[i]<<" ";
  160.     //cout<<endl;
  161.     y++;
  162.     for (int i=0; i<y; i++)
  163.        {
  164.                    // cout<<d[i]+d1[i]-r<<" "<<d2[i]<<"*"<<endl;
  165.         if (d[l[i]]+d1[l[i]]-r<=k && d2[l[i]]<ans)
  166.         {
  167.             ans = d2[l[i]];
  168.            // cout<<d[i]+d1[i]-r<<" "<<d2[i]<<endl;
  169.         }
  170.        }
  171.     cout<<ans;
  172.     return 0;
  173. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement