Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <iomanip>
- #include <cstring>
- #include <string>
- #include <algorithm>
- #include <queue>
- #include <vector>
- #include <cstdlib>
- #include <fstream>
- #include <ctime>
- #include <climits>
- using namespace std;
- #define F first
- #define S second
- long long a[3000][3000], fl[3000], pr[3000], d[3000], d1[3000], d2[3000], l[3000];
- int main()
- {
- ios_base::sync_with_stdio(0); //dear Satan, help me please ^_^
- freopen("input.txt", "r", stdin); //о, великий компилятор, призываю тебя, сжалься!!
- freopen("output.txt", "w", stdout); //гспд, дай мозгов
- int n,m; // aaaa schito ne tak?!
- cin>>n>>m; //pol'zuyas' sluchaem peredayu privet mame i pape
- for (int i=0; i<n; i++) //Artur ty nos
- for (int j=0; j<n; j++) //lel
- a[i][j] = INT_MAX/2; //kogo nado ubit', chtoby ono zashlo?
- int x,y,z;
- for (int i=0; i<m; i++)
- {
- cin>>x>>y>>z;
- x--;
- y--;
- a[x][y] = z;
- a[y][x] = z;
- }
- for (int i=0; i<n; i++)
- a[i][i] = 0;
- int k;
- cin>>k;
- int s,f,v;
- cin>>s>>f>>v;
- s--;
- f--;
- v--;
- for (int i=0; i<n; i++)
- {
- d[i] = a[s][i];
- fl[i] = 0;
- pr[i] = -1;
- }
- pr[s] = 0;
- fl[s] = 1;
- int minn, mn, p;
- p = s;
- for (int i=0; i<n-1; i++)
- {
- minn = INT_MAX/2;
- mn=0;
- for (int j=0; j<n; j++)
- if (fl[j] == 0 && d[j]<minn)
- {
- minn = d[j];
- mn = j;
- }
- p = mn;
- fl[mn] = 1;
- for (int j=0; j<n; j++)
- if (fl[j] == 0 && d[p]+a[p][j]<d[j])
- {
- d[j] = d[p] + a[p][j];
- pr[j] = p;
- }
- }
- // for (int i=0; i<n; i++)
- // cout<<d[i]<<" ";
- //cout<<endl;
- int r = d[f];
- int g = d[v];
- int j=v;
- y = 1;
- l[0] = v;
- while (pr[j] > 0)
- {
- l[y] = pr[j];
- //cout<<l[y]<<" ";
- j = pr[j];
- y++;
- }
- l[y] = s;
- // for (int i=0; i<=y; i++)
- // cout<<l[i]<<" ";
- //cout<<endl;
- for (int i=0; i<n; i++)
- {
- d1[i] = a[f][i];
- fl[i] = 0;
- pr[i] = -1;
- }
- pr[f] = 0;
- fl[f] = 1;
- p = f;
- for (int i=0; i<n-1; i++)
- {
- minn = INT_MAX/2;
- mn=0;
- for (int j=0; j<n; j++)
- if (fl[j] == 0 && d1[j]<minn)
- {
- minn = d1[j];
- mn = j;
- }
- p = mn;
- fl[mn] = 1;
- for (int j=0; j<n; j++)
- if (fl[j] == 0 && d1[p]+a[p][j]<d1[j])
- {
- d1[j] = d1[p] + a[p][j];
- pr[j] = p;
- }
- }
- for (int i=0; i<n; i++)
- {
- d2[i] = a[v][i];
- fl[i] = 0;
- pr[i] = -1;
- }
- pr[v] = 0;
- fl[v] = 1;
- p = v;
- for (int i=0; i<n-1; i++)
- {
- minn = INT_MAX/2;
- mn=0;
- for (int j=0; j<n; j++)
- if (fl[j] == 0 && d2[j]<minn)
- {
- minn = d2[j];
- mn = j;
- }
- p = mn;
- fl[mn] = 1;
- for (int j=0; j<n; j++)
- if (fl[j] == 0 && d2[p]+a[p][j]<d2[j])
- {
- d2[j] = d2[p] + a[p][j];
- pr[j] = p;
- }
- }
- int ans = g;
- // for (int i=0; i<=y; i++)
- // cout<<l[i]<<" ";
- //cout<<endl;
- y++;
- for (int i=0; i<y; i++)
- {
- // cout<<d[i]+d1[i]-r<<" "<<d2[i]<<"*"<<endl;
- if (d[l[i]]+d1[l[i]]-r<=k && d2[l[i]]<ans)
- {
- ans = d2[l[i]];
- // cout<<d[i]+d1[i]-r<<" "<<d2[i]<<endl;
- }
- }
- cout<<ans;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement