Cod sursa(job #2944176)

Utilizator CiuiGinjoveanu Dragos Ciui Data 22 noiembrie 2022 09:42:18
Problema Sate Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.34 kb
#include <iostream>
#include <fstream>
#include <string>
#include <cstring>
#include <algorithm>
#include <utility>
#include <cmath>
#include <map>
#include <deque>
#include <vector>
#include <set>
#include <queue>
#include <bitset>
#include <limits.h>
using namespace std;

ifstream fin("sate.in");
ofstream fout("sate.out");

const int MAX_SIZE = 30000;

int villages, date, start, finish;
set<pair<pair<int, int>, int>> intervals;
map<pair<int, int>, int> frq;

void calcDist() {
    set<pair<pair<int, int>, int>>::iterator itr;
    for (itr = intervals.begin(); itr != intervals.end(); ++itr) {
        int left = itr->first.first;
        int right = itr->first.second;
        int dist = itr->second;
        if (left == start && right == finish) {
            fout << dist;
            return;;
        }
        set<pair<pair<int, int>, int>>::iterator itr2;
        for (itr2 = intervals.begin(); itr2 != intervals.end(); ++itr2) {
            int left2 = itr2->first.first;
            int right2 = itr2->first.second;
            int dist2 = itr2->second;
            if (right == left2) {
                pair<int, int> interval = make_pair(left, right2);
                if (frq[interval] != 1) {
                    frq[interval] = 1;
                    intervals.insert(make_pair(interval, dist + dist2));
                }
            } else if (right == right2) {
                pair<int, int> interval = make_pair(left, left2);
                if (frq[interval] != 1) {
                    frq[interval] = 1;
                    intervals.insert(make_pair(interval, dist - dist2));
                }
            } else if (left == left2) {
                pair<int, int> interval = make_pair(right, right2);
                if (frq[interval] != 1) {
                    frq[interval] = 1;
                    intervals.insert(make_pair(interval, dist2 - dist));
                }
            }
        }
    }
    calcDist();
}

int main() {
    ios_base::sync_with_stdio(false);
    fin >> villages >> date >> start >> finish;
    for (int i = 1; i <= date; ++i) {
        int left, right, dist;
        fin >> left >> right >> dist;
        pair<int, int> interval = make_pair(left, right);
        frq[interval] = 1;
        intervals.insert(make_pair(interval, dist));
    }
    calcDist();
}

/*

 11 7 1 11
 1 7 10
 4 6 4
 5 7 4
 6 8 5
 2 10 15
 4 11 13
 5 8 8
 
 
 
 */