Submission #292500

#TimeUsernameProblemLanguageResultExecution timeMemory
292500maomao90Commuter Pass (JOI18_commuter_pass)C++14
100 / 100
1460 ms33520 KiB
#include <bits/stdc++.h>
using namespace std;

typedef pair <int, int> ii;
typedef pair <long long, long long> ll;

#define INF 1000000000000000000

int n, m;
int s, t;
int u, v;
vector <ii> adjList[200005], adjList1[200005], adjList2[200005];
long long distu[100005], distv[100005], dists[100005], distt[100005];
long long ans;

priority_queue<ll, vector<ii>, greater<ii> > pq;
void dijkstra(int a, long long *dist) {
	for (int i = 1; i <= n; i++) dist[i] = INF;
	dist[a] = 0;
	pq.emplace(0, a);
	while (!pq.empty()) {
		int u, d; tie(d, u) = pq.top(); pq.pop();
		if (d > dist[u]) continue;
		for (ii vw : adjList[u]) {
			int v, w; tie(v, w) = vw;
			if (dist[v] > dist[u] + w) {
				dist[v] = dist[u] + w;
				pq.emplace(dist[v], v);
			}
		}
	}
}

long long memo[100005][2];
long long dp(int i, bool stt) {
	if (memo[i][stt] != -1) return memo[i][stt];
	if (i == v) return 0;
	memo[i][stt] = INF;
	for (ii vw : adjList[i]) {
		int v, w; tie(v, w) = vw;
		if ((stt && dists[i] + distt[v] + w == dists[t]) || (!stt && dists[v] + distt[i] + w == dists[t]))
			memo[i][stt] = min(memo[i][stt], dp(v, stt));
		else memo[i][stt] = min(memo[i][stt], distv[v] + w);
	}
	return memo[i][stt];
}

int main() {
	scanf("%d%d", &n, &m);
	scanf("%d%d", &s, &t);
	scanf("%d%d", &u, &v);
	for (int i = 0; i < m; i++) {
		int a, b, c; scanf("%d%d%d", &a, &b, &c);
		adjList[a].emplace_back(b, c);
		adjList[b].emplace_back(a, c);
	}
	dijkstra(u, distu);
	dijkstra(v, distv);
	dijkstra(s, dists);
	dijkstra(t, distt);
	ans = distu[v];
	memset(memo, -1, sizeof memo);
	for (int i = 1; i <= n; i++) {
		if (dists[i] + distt[i] == dists[t]) {
			ans = min(ans, distu[i] + min(dp(i, true), dp(i, false)));
		}
	}
	printf("%lld\n", ans);
	return 0;
}

Compilation message (stderr)

commuter_pass.cpp: In function 'int main()':
commuter_pass.cpp:49:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   49 |  scanf("%d%d", &n, &m);
      |  ~~~~~^~~~~~~~~~~~~~~~
commuter_pass.cpp:50:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   50 |  scanf("%d%d", &s, &t);
      |  ~~~~~^~~~~~~~~~~~~~~~
commuter_pass.cpp:51:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   51 |  scanf("%d%d", &u, &v);
      |  ~~~~~^~~~~~~~~~~~~~~~
commuter_pass.cpp:53:21: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   53 |   int a, b, c; scanf("%d%d%d", &a, &b, &c);
      |                ~~~~~^~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...