제출 #1158452

#제출 시각아이디문제언어결과실행 시간메모리
1158452dubabubaConstruction Project 2 (JOI24_ho_t2)C++20
100 / 100
219 ms24808 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long int i64;
#define int long long
typedef pair<int, int> pii;
#define ff first
#define ss second
#define MP make_pair

const i64 inf = 1e18 + 10;
const int mxn = 2e5 + 10;

vector<i64> st, en;
vector<pii> adj[mxn];
int n, m, s, e, len;
i64 lim;

void djkstra(int st, vector<i64> &dis) {
	dis.resize(n + 1, inf);
	priority_queue<pii> pq;
	pq.push(MP(0, st));

	while(pq.size()) {
		int d = -pq.top().ff;
		int u = pq.top().ss;
		pq.pop();

		if(dis[u] < inf) continue;
		dis[u] = d;

		for(pii p : adj[u]) {
			int v = p.ff;
			int c = p.ss + d;
			if(dis[v] == inf)
				pq.push(MP(-c, v));
		}
	}
}

int32_t main() {
	cin >> n >> m;
	cin >> s >> e >> len >> lim;
	for(int i = 0; i < m; i++) {
		int a, b, c;
		cin >> a >> b >> c;
		adj[a].push_back(MP(b, c));
		adj[b].push_back(MP(a, c));
	}

	djkstra(s, st);
	djkstra(e, en);

	if(st[e] <= lim) {
		i64 ans = 1LL * n * (n - 1) / 2;
		cout << ans << endl;
		return 0;
	}

	st[0] = en[0] = -1;
	sort(st.begin(), st.end());
	sort(en.begin(), en.end());

	i64 ans = 0LL;
	for(int i = 1; i <= n; i++) {
		i64 sus = lim - len - st[i];
		if(sus < 0) continue;
		i64 add = upper_bound(en.begin(), en.end(), sus) - en.begin() - 1;
		ans += add;
	}

	cout << ans << endl;
	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...