Submission #1115177

#TimeUsernameProblemLanguageResultExecution timeMemory
1115177staszic_ojuzOlympic Bus (JOI20_ho_t4)C++17
0 / 100
1 ms592 KiB
#include <iostream>
#include <vector>
#include <queue>

using namespace std;

const int MAXN = 201;

int n, m;

const int MAX_ALL_N = 405;

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

bool odwiedzona[MAX_ALL_N];
int dijkstra_odleglosci[MAX_ALL_N];

int dijkstra(int a, int b) { //z a do b
	for (int i = 0; MAX_ALL_N > i; i++) {
		odwiedzona[i] = false;
		dijkstra_odleglosci[i] = -1;
	}
	
	priority_queue<pair<int, int>> kopiec;
	kopiec.push({0, a});
	
	pair<int, int> p1;
	
	int aktl_v, aktl_koszt;
	
	while (!kopiec.empty()) {
		p1 = kopiec.top();
		kopiec.pop();
		aktl_v = -p1.second;
		aktl_koszt = -p1.first;
		if (odwiedzona[aktl_v]) continue;
		else dijkstra_odleglosci[aktl_v] = aktl_koszt;
		
		for (pair<int, int> sasd: sasiedzi[aktl_v]) {
			if (odwiedzona[sasd.first]) continue;
			kopiec.push({-(aktl_koszt + sasd.second), sasd.first});
		}
	}
	return dijkstra_odleglosci[b];
}

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	
	cin >> n >> m;
	
	int w1, w2, w3, w4;
	
	for (int i = 0; m > i; i++) {
		cin >> w1 >> w2 >> w3 >> w4;
		sasiedzi[w1].push_back({w2, w3});
		sasiedzi[w1 + MAXN].push_back({w2 + MAXN, w3});
		sasiedzi[w2].push_back({w1 + MAXN, w3 + w4});
	}
	
	int wynik = 2000000000;
	int odl_do_n = dijkstra(1, n);
	int odl_n_do_1 = dijkstra(n, 1);
	int odl_do_n_prim = dijkstra(1, n + MAXN);
	int odl_n_prim_do_1_prim = dijkstra(n + MAXN, 1 + MAXN);
	
	if (odl_do_n != -1 && odl_n_do_1 != -1) {
		wynik = odl_do_n + odl_n_do_1;
	} if (odl_do_n_prim != -1 && odl_n_prim_do_1_prim != -1) {
		wynik = min(wynik, odl_do_n_prim + odl_n_prim_do_1_prim);
	}
	if (wynik == 2000000000) wynik = -1;
	cout << wynik;
	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...