Cod sursa(job #2951476)

Utilizator CiuiGinjoveanu Dragos Ciui Data 6 decembrie 2022 15:55:52
Problema Sate Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.23 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;
vector<pair<pair<int, int>, int>> intervals;
map<pair<int, int>, int> foundInterval;

void calcDist() {
    for (pair<pair<int, int>, int> interv : intervals) {
        int left = interv.first.first;
        int right = interv.first.second;
        int dist = interv.second;
        if (left == start && right == finish) {
            fout << dist;
            return;;
        }
        for (pair<pair<int, int>, int> interv : intervals) {
            int left2 = interv.first.first;
            int right2 = interv.first.second;
            int dist2 = interv.second;
            if (right == left2) {
                pair<int, int> interval = make_pair(left, right2);
                if (!foundInterval[interval]) {
                    foundInterval[interval] = 1;
                    intervals.push_back(make_pair(interval, dist + dist2));
                }
            } else if (right == right2) {
                pair<int, int> interval = make_pair(left, left2);
                if (!foundInterval[interval]) {
                    foundInterval[interval] = 1;
                    intervals.push_back(make_pair(interval, dist - dist2));
                }
            } else if (left == left2) {
                pair<int, int> interval = make_pair(right, right2);
                if (!foundInterval[interval]) {
                    foundInterval[interval] = 1;
                    intervals.push_back(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);
        foundInterval[interval] = 1;
        intervals.push_back(make_pair(interval, dist));
    }
    calcDist();
}