제출 #1115701

#제출 시각아이디문제언어결과실행 시간메모리
1115701staszic_ojuzCommuter Pass (JOI18_commuter_pass)C++17
0 / 100
58 ms11080 KiB
#include <iostream>
#include <vector>
#include <queue>

using namespace std;

typedef long long ll;

const int MAXN = 100001;

int n, m, s, t, u, v;

vector<pair<int, ll>> sasiedzi[MAXN];

ll odl_od_s[MAXN];
int ojciec_dijkstra[MAXN];
bool odwiedzone[MAXN];
vector<int> sciezka;
ll odl_od_u[MAXN];

void dijkstra_z_u_do_v() {
	priority_queue<pair<ll, int>> kopiec;
	kopiec.push({0, u});
	
	for (int i = 1; MAXN > i; i++) {
		odwiedzone[i] = false;
	}
	pair<ll, int> p1;
	ll aktl_koszt;
	int aktl_v;
	
	while (!kopiec.empty()) {
		p1 = kopiec.top();
		kopiec.pop();
		aktl_koszt = -p1.first;
		aktl_v = p1.second;
		if (odwiedzone[aktl_v]) continue;
		odwiedzone[aktl_v] = true;
		odl_od_u[aktl_v] = aktl_koszt;
		for (pair<int, ll> sasd: sasiedzi[aktl_v]) {
			if (odwiedzone[sasd.first]) continue;
			kopiec.push({-(aktl_koszt + sasd.second), sasd.first});
		}
	}
	cout << odl_od_u[v];
}
	

void dijkstra_z_s() {
	priority_queue<pair<ll, pair<int, int>>> kopiec;
	kopiec.push({0, {s, 0}});
	
	pair<ll, pair<int, int>> p1;
	ll aktl_koszt;
	int aktl_v, aktl_ojciec_dijkstra;
	
	while (!kopiec.empty()) {
		p1 = kopiec.top();
		kopiec.pop();
		aktl_koszt = -p1.first;
		aktl_v = p1.second.first;
		aktl_ojciec_dijkstra = p1.second.second;
		if (odwiedzone[aktl_v]) continue;
		odwiedzone[aktl_v] = true;
		odl_od_s[aktl_v] = aktl_koszt;
		ojciec_dijkstra[aktl_v] = aktl_ojciec_dijkstra;
		for (pair<int, ll> sasd: sasiedzi[aktl_v]) {
			if (odwiedzone[sasd.first]) continue;
			kopiec.push({-(aktl_koszt + sasd.second), {sasd.first, aktl_v}});
		}
	}
}
		
		
int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	
	cin >> n >> m >> s >> t >> u >> v;
	
	int w1, w2;
	ll w3;
	
	for (int i = 0; m > i; i++) {
		cin >> w1 >> w2 >> w3;
		sasiedzi[w1].push_back({w2, w3});
	}
	
	dijkstra_z_s();
	
	/*for (int i = 1; n >= i; i++) {
		cout << i << " odl od s " << odl_od_s[i] << " ojciec dijkstra " << ojciec_dijkstra[i] << "\n";
	}*/
	int aktl_v = t;
	while (aktl_v) {
		sciezka.push_back(aktl_v);
		aktl_v = ojciec_dijkstra[aktl_v];
	}
	int aktl_ind = int(sciezka.size()) - 1;
	while (aktl_ind) {
		for (int i = 0; int(sasiedzi[sciezka[aktl_ind]].size()) > i; i++) {
			if (sasiedzi[sciezka[aktl_ind]][i].first == sciezka[aktl_ind - 1]) {
				sasiedzi[sciezka[aktl_ind]][i].second = 0;
				aktl_ind--;
				break;
			}
		}
	}
	dijkstra_z_u_do_v();
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...