Submission #1214201

#TimeUsernameProblemLanguageResultExecution timeMemory
1214201trimkusConstruction Project 2 (JOI24_ho_t2)C++20
45 / 100
2091 ms17600 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;


int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	int n, m;
	cin >> n >> m;
	int s, t, l;
	ll k;
	cin >> s >> t >> l >> k;
	vector<vector<pair<int, int>>> adj(n + 1);
	for (int i = 0; i < m; ++i) {
		int a, b, w;
		cin >> a >> b >> w;
		adj[a].push_back({b, w});
		adj[b].push_back({a, w});
	}
	auto dijikstra = [&](int st, vector<ll>& dist) -> void {
		priority_queue<array<ll, 2>> pq;
		pq.push({0, st});
		dist[st] = 0;
		while (pq.size()) {
			ll d = -pq.top()[0];
			int v = pq.top()[1];
			pq.pop();
			if (dist[v] != d) continue;
			for (auto& [u, w] : adj[v]) {
				if (dist[u] > dist[v] + w) {
					dist[u] = dist[v] + w;
					pq.push({-dist[u], u});
				}
			}
		}
	};
	const ll INF = 1e18;
	vector<ll> dist1(n + 1, INF), dist2(n + 1, INF);
	dijikstra(s, dist1);
	dijikstra(t, dist2);
	int res = 0;
	if (dist1[t] <= k) {
		cout << n * (n - 1) / 2 << "\n";
		return 0;
	}
	for (int i = 1; i <= n; ++i) {
		for (int j = 1; j <= n; ++j) {
			if (i == j) continue;
			ll total = min(dist1[j], l + dist1[i]) + dist2[j];
			//~ cout << i << " -> " << j << " = " << total << "\n";
			if (total <= k) {
				res += 1;
			}
		}
	}
	
	cout << res << "\n";
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...