Submission #833960

#TimeUsernameProblemLanguageResultExecution timeMemory
833960vjudge1Commuter Pass (JOI18_commuter_pass)C++17
0 / 100
72 ms13864 KiB
#include<bits/stdc++.h>
#define ll long long
#define pli pair<ll, int>
#define fi first
#define se second
using namespace std;
const ll nmax = 1e5+5;
int n, m, s, t, u, v;
vector<pli> adj[nmax];
ll du[nmax], dv[nmax], ds[nmax], dt[nmax], dp[nmax], ans;
priority_queue<pli, vector<pli>, greater<pli>> pq;

void dijkstra(int s, ll dist[nmax])
{
	memset(dist, 0x3f, sizeof(dist));
	dist[s]=0;
	pq.push({0, s});
	while(!pq.empty())
    {
		pli p=pq.top();
		pq.pop();
		int u=p.se;
		if(p.fi>dist[u])
			continue;
		for(pli e : adj[u])
		{
			int v=e.se;
			if(dist[u]+e.fi<dist[v])
			{
				dist[v]=dist[u]+e.fi;
				pq.push({dist[v], v});
			}
		}
	}
}

ll cdp(int u, bool a)
{
    if(dp[u]==-1)
    {
        if(ds[u]+dt[u]==ds[t])
        {
            dp[u]=dv[u];
			for(pli e : adj[u])
				if(a?ds[u]+e.fi == ds[e.se]:dt[u]+e.fi==dt[e.se])
					dp[u]=min(cdp(e.se, a), dp[u]);
			ans=min(du[u]+dp[u], ans);
		}
        else dp[u]=1e18;
	}
	return dp[u];
}

int main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	cin >> n >> m >> s >> t >> u >> v, --s, --t, --u, --v;
	while(m--)
    {
		int ui, vi, wi;
		cin >> ui >> vi >> wi;
        ui--; vi--;
		adj[ui].push_back({wi, vi});
		adj[vi].push_back({wi, ui});
	}
	dijkstra(u, du);
	dijkstra(v, dv);
	dijkstra(s, ds);
	dijkstra(t, dt);
	ans=du[v];
	memset(dp, -1, 8*n);
	cdp(t, 0);
	memset(dp, -1, 8*n);
	cdp(s, 1);
	cout<<ans;
}

Compilation message (stderr)

commuter_pass.cpp: In function 'void dijkstra(int, long long int*)':
commuter_pass.cpp:15:28: warning: 'sizeof' on array function parameter 'dist' will return size of 'long long int*' [-Wsizeof-array-argument]
   15 |  memset(dist, 0x3f, sizeof(dist));
      |                           ~^~~~~
commuter_pass.cpp:13:25: note: declared here
   13 | void dijkstra(int s, ll dist[nmax])
      |                         ^
commuter_pass.cpp:15:21: warning: argument to 'sizeof' in 'void* memset(void*, int, size_t)' call is the same expression as the destination; did you mean to dereference it? [-Wsizeof-pointer-memaccess]
   15 |  memset(dist, 0x3f, sizeof(dist));
      |                     ^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...