Pagini recente » Cod sursa (job #1811819) | Cod sursa (job #811817) | Cod sursa (job #1379547) | Cod sursa (job #587269) | Cod sursa (job #2944176)
#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
*/