Submission #1256544

#TimeUsernameProblemLanguageResultExecution timeMemory
12565444QT0RCommuter Pass (JOI18_commuter_pass)C++17
0 / 100
149 ms327680 KiB
/*
Podzadanie: N <= 300

Złożoność: O(N^3)

Dla każdej pary wierzchołków X, Y rozważamy, jaki jest wynik.
Zakładamy, że X jest pierwszyn wierzchołkiem ze ścieżki od U do V,
który leży na jakiejś najkrótszej ścieżce z S do T, a Y ostatnim.
Zauważmy tutaj, że X oraz Y muszą być na tej samej ścieżce.
Oznacza to, że z X do Y możemy się dostać kosztem 0.

Oznaczmy d(v, u) odległość v oraz u.

Z U do X docieramy kosztem d(U, X), z X do Y kosztem 0, a z Y do V kosztem d(Y, V).
Aby sprawdzić, czy X, Y leżą na jakiejś najkrótszej ścieżce z S do T,
sprawdzamy czy d(S, X) + d(X, Y) + d(Y, T) = d(S, T).

Odległości między każdą parą wierzchołków liczymy algorytmem Floyda-Warshalla.
*/

#include <bits/stdc++.h>
using namespace std;
using ll = long long;

ll N, M, S, T, U, V;

vector<vector<ll>> dist;

const ll oo = 1e18;

void init()
{
	cin >> N >> M >> S >> T >> U >> V;
	dist.resize(N + 1, vector<ll>(N + 1, oo));
	for (ll i = 1; i <= N; i++)
		dist[i][i] = 0;
	for (ll i = 1, a, b, c; i <= M; i++)
	{
		cin >> a >> b >> c;
		dist[a][b] = min(dist[a][b], c);
		dist[b][a] = min(dist[b][a], c);
	}
}

int main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);

	init();
	for (ll k = 1; k <= N; k++)
	{
		for (ll v = 1; v <= N; v++)
		{
			for (ll u = 1; u <= N; u++)
			{
				dist[v][u] = min(dist[v][u], dist[v][k] + dist[k][u]);
			}
		}
	}
	ll ans = oo;
	for (ll X = 1; X <= N; X++)
	{
		for (ll Y = 1; Y <= N; Y++)
		{
			if ((dist[S][X] + dist[X][Y] + dist[Y][T]) == dist[S][T])
				ans = min(ans, dist[U][X] + dist[Y][V]);
		}
	}
	cout << ans << '\n';
}

/*
6 6
1 6
1 4
1 2 1
2 3 1
3 5 1
2 4 3
4 5 2
5 6 1
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...