Submission #719969

#TimeUsernameProblemLanguageResultExecution timeMemory
719969yellowtoadCommuter Pass (JOI18_commuter_pass)C++17
0 / 100
328 ms31024 KiB
#include <iostream>
#include <vector>
#include <queue>
#define f first
#define se second
#define pll pair<long long,long long>
using namespace std;

long long n, m, s, t, ss, tt, dist[100010], disu[100010], disv[100010], vis[100010], in[100010], minu[100010], minv[100010], minn[100010];
vector<pll> edge[100010];
vector<long long> dag[100010];
priority_queue<pll,vector<pll>,greater<pll>> pq;

void dijk(int st, long long (&dis)[100010]) {
	pq.push({0,st});
	for (int i = 1; i <= n; i++) dis[i] = 1e18, vis[i] = 0;
	dis[st] = 0;
	while (pq.size()) {
		long long u = pq.top().se;
		pq.pop();
		if (vis[u]) continue;
		vis[u] = 1;
		for (int i = 0; i < edge[u].size(); i++) {
			if (dis[edge[u][i].f] > dis[u]+edge[u][i].se) {
				dis[edge[u][i].f] = dis[u]+edge[u][i].se;
				pq.push({dist[edge[u][i].f],edge[u][i].f});
			}
		}
	}
}

void dfs(int u) {
	minu[u] = min(minu[u],disu[u]);
	minv[u] = min(minv[u],disv[u]);
	minn[u] = min(minn[u],min(minu[u]+disv[u],minv[u]+disu[u]));
	for (int i = 0; i < dag[u].size(); i++) {
		long long v = dag[u][i];
		in[v]--;
		minu[v] = min(minu[v],minu[u]);
		minv[v] = min(minv[v],minv[u]);
		minn[v] = min(minn[v],minn[u]);
		if (!in[v]) dfs(v);
	}
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	cin >> n >> m >> s >> t >> ss >> tt;
	for (int i = 1; i <= m; i++) {
		long long u, v, w;
		cin >> u >> v >> w;
		edge[u].push_back({v,w});
		edge[v].push_back({u,w});
	}
	dijk(ss,disu);
	dijk(tt,disv);
	dijk(s,dist);
	for (int i = 1; i <= n; i++) {
		for (int j = 0; j < edge[i].size(); j++) {
			if (dist[i]+edge[i][j].se == dist[edge[i][j].f]) {
				dag[i].push_back(edge[i][j].f);
				in[edge[i][j].f]++;
			}
		}
	}
	for (int i = 1; i <= n; i++) minu[i] = minv[i] = minn[i] = 1e18;
	dfs(s);
	cout << min(disu[tt],minn[t]) << endl;
}

Compilation message (stderr)

commuter_pass.cpp: In function 'void dijk(int, long long int (&)[100010])':
commuter_pass.cpp:23:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   23 |   for (int i = 0; i < edge[u].size(); i++) {
      |                   ~~^~~~~~~~~~~~~~~~
commuter_pass.cpp: In function 'void dfs(int)':
commuter_pass.cpp:36:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   36 |  for (int i = 0; i < dag[u].size(); i++) {
      |                  ~~^~~~~~~~~~~~~~~
commuter_pass.cpp: In function 'int main()':
commuter_pass.cpp:60:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   60 |   for (int j = 0; j < edge[i].size(); j++) {
      |                   ~~^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...