Advertisement
Art_Uspen

Untitled

Apr 24th, 2021
757
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.27 KB | None | 0 0
  1. #include <iostream>
  2. #include <queue>
  3. #include <tuple>
  4. #include <vector>
  5. #include <set>
  6.  
  7. using namespace std;
  8.  
  9. struct my_pair_g {
  10.     int v;
  11.     int weight;
  12.  
  13.     my_pair_g(int v_, int weight_) :
  14.             v(v_), weight(weight_) {}
  15. };
  16.  
  17. struct my_pair_s {
  18.     int64_t dist;
  19.     int v;
  20.  
  21.     my_pair_s(int64_t dist_, int v_) :
  22.             dist(dist_), v(v_) {}
  23. };
  24.  
  25. struct timetable {
  26.     int st_time;
  27.     int fin_time;
  28.  
  29.     timetable(int s_, int f_) :
  30.             st_time(s_), fin_time(f_) {}
  31.  
  32.     timetable() :
  33.             st_time(0), fin_time(0) {}
  34. };
  35.  
  36. int main() {
  37.     int N;
  38.     cin >> N;
  39.     int start;
  40.     cin >> start;
  41.     --start;
  42.     int finish;
  43.     cin >> finish;
  44.     --finish;
  45.     int M;
  46.     cin >> M;
  47.     vector<vector<vector<timetable>>> graph(N, vector<vector<timetable>>(N));
  48.     for (int i = 0; i < M; ++i) {
  49.         int a_vil;
  50.         cin >> a_vil;
  51.         --a_vil;
  52.         int st_time;
  53.         cin >> st_time;
  54.         int b_vil;
  55.         cin >> b_vil;
  56.         --b_vil;
  57.         int fin_time;
  58.         cin >> fin_time;
  59.         graph[a_vil][b_vil].emplace_back(st_time, fin_time);
  60.     }
  61.     vector<int64_t> distances(N, 3000'000'000'00);
  62.    distances[start] = 0;
  63.    auto cmp = [](my_pair_s a, my_pair_s b) { return tie(a.dist, a.v) < tie(b.dist, b.v); };
  64.    set<my_pair_s, decltype(cmp)> s_que(cmp);
  65.    s_que.insert({distances[start], start});
  66.    while (!s_que.empty()) {
  67.        int vert = s_que.begin()->v;
  68.        s_que.erase(s_que.begin());
  69.        for (int pot_neig = 0; pot_neig < N; ++pot_neig) {
  70.            if (!graph[vert][pot_neig].empty()) {
  71.                vector<timetable> neig_v = graph[vert][pot_neig];//если есть сосед на этой позиции
  72.                for (size_t j = 0; j < neig_v.size(); ++j) {
  73.                    if (distances[vert] <= neig_v[j].st_time) {
  74.                        if (distances[pot_neig] > neig_v[j].fin_time) {
  75.                            distances[pot_neig] = neig_v[j].fin_time;
  76.                        }
  77.                    }
  78.                }
  79.                s_que.insert({distances[pot_neig], pot_neig});
  80.            }
  81.        }
  82.    }
  83.    if (distances[finish] == 3000'000'000'00) {
  84.         cout << -1;
  85.     }else{
  86.         cout << distances[finish];
  87.     }
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement