const int INF = 1000000000; vector>> adj; void dijkstra(int s, vector & d, vector & p) { int n = adj.size(); d.assign(n, INF); p.assign(n, -1); d[s] = 0; using pii = pair; priority_queue, greater> q; q.push({0, s}); while (!q.empty()) { int v = q.top().second; int d_v = q.top().first; q.pop(); if (d_v != d[v]) continue; for (auto edge : adj[v]) { int to = edge.first; int len = edge.second; if (d[v] + len < d[to]) { d[to] = d[v] + len; p[to] = v; q.push({d[to], to}); } } } }