Submission #1185141

#TimeUsernameProblemLanguageResultExecution timeMemory
1185141witek_cppOlympic Bus (JOI20_ho_t4)C11
Compilation error
0 ms0 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <queue>
 
using namespace std;
typedef long long ll;
 
#define st first
#define nd second
#define f(a, c, b) for (int a = c; b > a; a++)
#define pb push_back
#define all(a) a.begin(), a.end()

const ll DUZO = 1'000'000'000'000'000'000;

ll wnk = DUZO;
 
int n, m;
vector<pair<pair<int, int>, pair<ll, ll>>> krawedzie;
vector<vector<ll>> odl;
vector<vector<int>> ile; //ile minimalnych krawedzi wychodzi z i do j
vector<vector<pair<ll, ll>>> macierz_sasiedztwa;

vector<ll> wyniki_dijkstra;

ll dijkstra(int zrodlo) {
	f(i, 1, n + 1) {
		wyniki_dijkstra[i] = -1;
	}
	
	priority_queue<pair<ll, int>> kolejka;
	
	kolejka.push({0, zrodlo});
	
	pair<ll, int> p1;
	
	while (!kolejka.empty()) {
		p1 = kolejka.top();
		kolejka.pop();
		if (wyniki_dijkstra[p1.nd] != -1) continue;
		wyniki_dijkstra[p1.nd] = -p1.st;
		f(i, 1, n + 1) {
			if (wyniki_dijkstra[i] != -1 || i == p1.nd || macierz_sasiedztwa[p1.nd][i].st == -1) continue;
			kolejka.push({p1.st - macierz_sasiedztwa[p1.nd][i].st, i});
		}
	}
	if (zrodlo == 1) return wyniki_dijkstra[n];
	return wyniki_dijkstra[1];
}
 
int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    
    cin >> n >> m;
    int w1, w2;
    ll w3, w4;
    odl.resize(n + 1, vector<ll>(n + 1, DUZO));
    
    f(i, 1, (n + 1)) odl[i][i] = 0;
    
    f(i, 0, m) {
        cin >> w1 >> w2 >> w3 >> w4;
        krawedzie.pb({{w1, w2}, {w3, w4}});
        odl[w1][w2] = min(odl[w1][w2], w3);  
    }
    
    f(k, 1, (n + 1)) f(u, 1, (n + 1)) f(v, 1, (n + 1)) odl[u][v] = min(odl[u][v], odl[u][k] + odl[k][v]);
    
    ile.resize(n + 1, vector<int>(n + 1, 0));
   
    macierz_sasiedztwa.resize(n + 1, vector<pair<ll, ll>>(n, {DUZO, DUZO}));
    
    for (pair<pair<int, int>, pair<ll, ll>> ele: krawedzie) {
		if (macierz_sasiedztwa[ele.st.st][ele.st.nd].st > ele.nd.st) {
			macierz_sasiedztwa[ele.st.st][ele.st.nd].nd = macierz_sasiedztwa[ele.st.st][ele.st.nd].st;
			macierz_sasiedztwa[ele.st.st][ele.st.nd].st = ele.nd.st;
		}
		macierz_sasiedztwa[ele.st.st][ele.st.nd].nd = min(macierz_sasiedztwa[ele.st.st][ele.st.nd].nd, ele.nd.st);
	} 
	
	f(i, 1, n + 1) {
		f(j, 1, n + 1) {
			f(k, 1, n + 1) {
				if (macierz_sasiedztwa[i][k].st <= 1'000'000 && ((macierz_sasiedztwa[i][k].st + odl[k][j]) == odl[i][j])) ile[i][j]++;
				if (macierz_sasiedztwa[i][k].nd <= 1'000'000 && ((macierz_sasiedztwa[i][k].nd + odl[k][j]) == odl[i][j])) ile[i][j]++;
			}
		}
	}
	
	pair<ll, ll> p1;
	pair<ll, ll> p2;
	
	wyniki_dijkstra.resize(n + 1);
	
	for (pair<pair<int, int>, pair<ll, ll>> ele: krawedzie) {
		if (((odl[1][ele.st.st] + ele.nd.st + odl[ele.st.nd][n]) > odl[1][n]) && (ile[ele.st.st][n] > 1)) {
			wnk = min(wnk, odl[1][n] + odl[n][ele.st.nd] + odl[ele.st.st][1] + ele.nd.st + ele.nd.nd);
		} else {
			if (macierz_sasiedztwa[ele.st.nd][ele.st.st].st > ele.nd.st) {
				p1 = macierz_sasiedztwa[ele.st.nd][ele.st.st];
				p2 = macierz_sasiedztwa[ele.st.st][ele.st.nd];
				macierz_sasiedztwa[ele.st.nd][ele.st.st].st = ele.nd.st;
				if (macierz_sasiedztwa[ele.st.st][ele.st.nd].st == ele.nd.st) {
					macierz_sasiedztwa[ele.st.st][ele.st.nd].st = macierz_sasiedztwa[ele.st.st][ele.st.nd].nd;
				}
				wnk = min(wnk, dijkstra(1) + dijkstra(n) + ele.nd.nd);
				macierz_sasiedztwa[ele.st.nd][ele.st.st] = p1;
				macierz_sasiedztwa[ele.st.st][ele.st.nd] = p2;
			}
		}
	}
	if (wnk >= (2'000'000'000)) {
		cout << -1 << "\n";
	} else {
		cout << wnk << "\n";
	}
    return 0;
}

Compilation message (stderr)

ho_t4.c:1:10: fatal error: iostream: No such file or directory
    1 | #include <iostream>
      |          ^~~~~~~~~~
compilation terminated.