Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <queue>
- #include <tuple>
- #include <vector>
- #include <set>
- using namespace std;
- struct my_pair_g {
- int v;
- int weight;
- my_pair_g(int v_, int weight_) :
- v(v_), weight(weight_) {}
- };
- struct my_pair_s {
- int64_t dist;
- int v;
- my_pair_s(int64_t dist_, int v_) :
- dist(dist_), v(v_) {}
- };
- struct timetable {
- int st_time;
- int fin_time;
- timetable(int s_, int f_) :
- st_time(s_), fin_time(f_) {}
- timetable() :
- st_time(0), fin_time(0) {}
- };
- int main() {
- int N;
- cin >> N;
- int start;
- cin >> start;
- --start;
- int finish;
- cin >> finish;
- --finish;
- int M;
- cin >> M;
- vector<vector<vector<timetable>>> graph(N, vector<vector<timetable>>(N));
- for (int i = 0; i < M; ++i) {
- int a_vil;
- cin >> a_vil;
- --a_vil;
- int st_time;
- cin >> st_time;
- int b_vil;
- cin >> b_vil;
- --b_vil;
- int fin_time;
- cin >> fin_time;
- graph[a_vil][b_vil].emplace_back(st_time, fin_time);
- }
- vector<int64_t> distances(N, 3000'000'000'00);
- distances[start] = 0;
- auto cmp = [](my_pair_s a, my_pair_s b) { return tie(a.dist, a.v) < tie(b.dist, b.v); };
- set<my_pair_s, decltype(cmp)> s_que(cmp);
- s_que.insert({distances[start], start});
- while (!s_que.empty()) {
- int vert = s_que.begin()->v;
- s_que.erase(s_que.begin());
- for (int pot_neig = 0; pot_neig < N; ++pot_neig) {
- if (!graph[vert][pot_neig].empty()) {
- vector<timetable> neig_v = graph[vert][pot_neig];//если есть сосед на этой позиции
- for (size_t j = 0; j < neig_v.size(); ++j) {
- if (distances[vert] <= neig_v[j].st_time) {
- if (distances[pot_neig] > neig_v[j].fin_time) {
- distances[pot_neig] = neig_v[j].fin_time;
- }
- }
- }
- s_que.insert({distances[pot_neig], pot_neig});
- }
- }
- }
- if (distances[finish] == 3000'000'000'00) {
- cout << -1;
- }else{
- cout << distances[finish];
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement