Submission #1338242

#TimeUsernameProblemLanguageResultExecution timeMemory
1338242manCommuter Pass (JOI18_commuter_pass)C++17
0 / 100
236 ms19040 KiB
// Day Created: mar 17th 2026
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>

#define fname ""
#define ll long long
#define pii pair<int, int>
#define pli pair<ll, int>
#define fi first
#define se second

using namespace std;
int n, m, S, T, U, V;
vector<pii> edge[100005];

ll distU[100005], distV[100005], dp[2][100005], dist[100005];
bool vis[100005];

void dijktra(ll dist[], const int &s) {
	priority_queue<pli, vector<pli>, greater<pli>> pq;
	fill(dist+1, dist+n+1, 1e16);
	dist[s]=0;
	pq.push({0, s});
	while(!pq.empty()) {
		auto [d, u]=pq.top();
		pq.pop();
		if(d!=dist[u]) continue;
		for(const auto &[v, w]:edge[u]) 
			if(dist[v]>d+w) 
				dist[v]=d+w, pq.push({dist[v], v});
	}
}

ll answer(const int &s, const int &t) {
	fill(dp[0]+1, dp[0]+n+1, 1e16);
	fill(dp[1]+1, dp[1]+n+1, 1e16);
	fill(vis+1, vis+n+1, false);
	priority_queue<pair<ll, pii>, vector<pair<ll, pii>>, greater<pair<ll, pii>>> pq;
	dp[0][s]=distU[s], dp[1][s]=distU[s]+distV[s];
	pq.push({0, {s, s}});
	while(!pq.empty()) {
		auto [d, par]=pq.top();
		pq.pop();
		auto [u, p]=par;
		if(!vis[u]) {
			vis[u]=1;
			dp[0][u]=min({dp[0][u], distU[u], dp[0][p]}), 
			dp[1][u]=min({dp[1][u], dp[0][u]+distV[u], dp[1][p]});
			for(const auto &[v, w]:edge[u]) 
				pq.push({d+w, {v, u}});
		}
		else 
			dp[0][u]=min({dp[0][u], distU[u], dp[0][p]}), 
			dp[1][u]=min({dp[1][u], dp[0][u]+distV[u], dp[1][p]});
	}
	return dp[1][t];
}

void solve() {
	cin>>n>>m>>S>>T>>U>>V;
	while(m--) {
		int u, v, w;
		cin>>u>>v>>w;
		edge[u].emplace_back(make_pair(v, w));
		edge[v].emplace_back(make_pair(u, w));
	}
	dijktra(distU, U);
	dijktra(distV, V);
	cout<<min({distU[V], answer(S, T), answer(T, S)});
}

main() {
	if(fopen(fname".inp", "r")) {
		freopen(fname".inp", "r", stdin);
		freopen(fname".out", "w", stdout);
	}
	cin.tie(0)->sync_with_stdio(0);
	int tc=1;
	// cin>>tc;
	while(tc--) {
		solve();
		cout<<'\n';
	}
}

Compilation message (stderr)

commuter_pass.cpp:74:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   74 | main() {
      | ^~~~
commuter_pass.cpp: In function 'int main()':
commuter_pass.cpp:76:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   76 |                 freopen(fname".inp", "r", stdin);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
commuter_pass.cpp:77:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   77 |                 freopen(fname".out", "w", stdout);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...