Submission #758650

#TimeUsernameProblemLanguageResultExecution timeMemory
758650kokoxuyaCommuter Pass (JOI18_commuter_pass)C++14
0 / 100
457 ms30296 KiB
#include <bits/stdc++.h> using namespace std; typedef long long lo; //note: everything is one-indexed lo nodes, edges, s,t,u,v, temp1,temp2,temp3; vector<tuple<lo,lo,lo>>elist(200001); vector<vector<pair<lo,lo>>>adjlist(100001); int ucount = 0; //ducks lo dp(lo start, vector<bool> &visited, vector<lo> &distv, lo ans, vector<vector<int>> &usable_edges) { if (visited[start]) return 9223372036854775807; visited[start] = true; ans = distv[start]; for (int x: usable_edges[start]) { ans = min(ans,dp(x,visited,distv,ans,usable_edges)); } cout << ans; return ans; } void dijkstra(int n, vector<lo> &dist) { priority_queue<pair<lo,lo>, vector<pair<lo,lo>> , greater<pair<lo,lo>>>pq; fill(dist.begin(),dist.end(),-1); lo temp1,temp2,temp3,temp4; pq.push(make_pair(0,n)); //cout << "pq: " << pq.top().first << " " << pq.top().second << "\n"; while (!pq.empty()) { tie(temp1,temp2) = pq.top(); // cost, node pq.pop(); if (dist[temp2] != -1) //already visited { continue; } dist[temp2] = temp1; //cout << "Initialising " << temp2 << " to " << temp1 << "\n"; for (auto x : adjlist[temp2]) { tie(temp3,temp4) = x; //cost, node pq.push(make_pair(temp1 + temp3, temp4)); } } } int main() { cin >> nodes >> edges >> s >> t >> u >> v; //cout << "v: " << v << "\n"; vector<vector<int>>usable_edges(nodes + 1); for (int a = 1; a <= edges; a++) { cin >> temp1 >> temp2 >> temp3; adjlist[temp1].push_back(make_pair(temp3,temp2)); adjlist[temp2].push_back(make_pair(temp3,temp1)); elist[a] = make_tuple(temp1,temp2,temp3); } /*cout << "Outputting all edges: (cost,start,end)\n"; for (int a = 1; a <= nodes; a++) { for (auto x: adjlist[a]) { int b,c; tie(b,c) = x; cout << b << " " << a << " " << c << "\n"; } }*/ vector<lo>dists(nodes + 1),distu(nodes + 1),distt(nodes + 1),distv(nodes + 1); dijkstra(s,dists);dijkstra(t,distt);dijkstra(u,distu);dijkstra(v,distv); /*cout << "Outputting minimum distances from s: \n"; for (int a = 1; a <= nodes; a++) { cout << dists[a] << " "; } cout << " \nOutputting minimum distance from u ;)\n"; for (int a = 1; a <= nodes; a++) { cout << distu[a] << " "; } cout << " \n";*/ lo ans, mind = distv[u]; //cout << "ans and mind: " << ans << " " << mind << "\n"; for (int a = 1; a <= edges; a++) //for each edge { tie(temp1,temp2,temp3) = elist[a]; //start,end,cost if (dists[temp1] + distt[temp2] + temp3 == mind) { //if edge can be used usable_edges[temp1].push_back(temp2); usable_edges[temp2].push_back(temp1); ucount += 1; } else if (dists[temp2] + distt[temp1] + temp3 == mind) { usable_edges[temp2].push_back(temp1); usable_edges[temp1].push_back(temp2); ucount += 1; } } vector<bool> visited(nodes + 1); fill(visited.begin(),visited.end(),false); cout << dp(u,visited,distv,ans,usable_edges); }

Compilation message (stderr)

commuter_pass.cpp: In function 'int main()':
commuter_pass.cpp:114:48: warning: 'ans' may be used uninitialized in this function [-Wmaybe-uninitialized]
  114 |     cout << dp(u,visited,distv,ans,usable_edges);
      |                                                ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...