답안 #1115061

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1115061 2024-11-19T23:33:10 Z staszic_ojuz Olympic Bus (JOI20_ho_t4) C++17
0 / 100
1000 ms 3524 KB
#include <iostream>
#include <vector>
#include <queue>

using namespace std;

const int MAXN = 201;

int n, m;

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

int dijkstra_odwrocona_pomocnik[MAXN];
bool odwiedzona[MAXN];

int dijkstra_odwrocona(int od_, int do_, int u, int v, int cost, int rodzaj_grafu) {
	for (int i = 0; MAXN > i; i++) {
		odwiedzona[i] = false;
		dijkstra_odwrocona_pomocnik[i] = 1010000000;
	}
	priority_queue<pair<int, int>>  kolejka;  //koszt wierzcholek
	kolejka.push({0, od_});
	
	pair<int, int> p1;
	int aktl_v;
	int aktl_koszt;
	
	while (!kolejka.empty()) {
		p1 = kolejka.top();
		aktl_v = p1.second;
		aktl_koszt = -p1.first;
		kolejka.pop();
		if (odwiedzona[aktl_v]) continue;
		odwiedzona[aktl_v] = true;
		dijkstra_odwrocona_pomocnik[aktl_v] = aktl_koszt;
		if (aktl_v == v) {
			if (!odwiedzona[u]) {
				kolejka.push({-(aktl_koszt + cost), u});
			}
		}
		for (pair<int, pair<int, int>> ele: sasiedzi[aktl_v][rodzaj_grafu]) {
			if (aktl_v != u) {
				if (odwiedzona[ele.first]) continue;
				kolejka.push({-(aktl_koszt + ele.second.first), ele.first});
			} else {
				if (ele.first != v) {
					if (odwiedzona[ele.first]) continue;
					kolejka.push({-(aktl_koszt + ele.second.first), ele.first});
				} 
			} 
		}
		
	}
	return dijkstra_odwrocona_pomocnik[do_];
}
int p;
int zrob(int v, int u, int cost, int d) {
	int wynik = d;
	//cout << "d " << d << "\n";
	wynik += dijkstra_odwrocona(1, n, v, u, cost, 0);
	//cout << "z " << 1 << " do " << n << " " << wynik - d<< "\n";
	p = dijkstra_odwrocona(n, 1, v, u, cost, 0);
	wynik += p;
	//cout << "z " << n << " do " << 1 << " " << p << "\n";
	return wynik;
}

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;
		krawedzie.push_back({{w1, w2}, {w3, w4}});
		sasiedzi[w1][0].push_back({w2, {w3, w4}});
		sasiedzi[w2][1].push_back({w1, {w3, w4}});
	}
	
	int wynik = 1010000000;
	wynik = min(1010000000, zrob(-1, -1, 0, 0));
	for (auto ele: krawedzie) {
		cout << "min " << wynik << " " << zrob(ele.first.first, ele.first.second, ele.second.first, ele.second.second) << "\n";
		wynik = min(wynik, zrob(ele.first.first, ele.first.second, ele.second.first, ele.second.second));
	}
	cout << "OK " << wynik << "\n";
	if (wynik >= 1010000000) {
		wynik = -1;
	}
	cout << wynik << "\n";
	return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 112 ms 540 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1063 ms 3524 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 114 ms 540 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 112 ms 540 KB Output isn't correct
2 Halted 0 ms 0 KB -