제출 #1338231

#제출 시각아이디문제언어결과실행 시간메모리
1338231manCommuter Pass (JOI18_commuter_pass)C++17
0 / 100
196 ms14976 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];

priority_queue<pli, vector<pli>, greater<pli>> pq;
void dijktra(ll dist[], const int &s) {
	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(dist+1, dist+n+1, 1e16);
	dp[0][s]=distU[s], dp[1][s]=distU[s]+distV[s];
	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]+w==d) 
				dp[0][u]=min(distU[u], dp[0][v]);
		for(const auto &[v, w]:edge[u]) 
			if(dist[v]+w==d) 
				dp[1][u]=min(dp[1][v], dp[0][u]+distV[u]);
		for(const auto &[v, w]:edge[u]) 
			if(dist[v]>d+w) 
				dist[v]=d+w, pq.push({dist[v], v});
	}
	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(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';
	}
}

컴파일 시 표준 에러 (stderr) 메시지

commuter_pass.cpp:72:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   72 | main() {
      | ^~~~
commuter_pass.cpp: In function 'int main()':
commuter_pass.cpp:74:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   74 |                 freopen(fname".inp", "r", stdin);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
commuter_pass.cpp:75:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   75 |                 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...