dist[u1] = 0; p[u1] = u1; priority_queue<pair<int,int>,vector<pair<int,int>>, greater<pair<int,int>>> q; q.push(make_pair(0, u1)); while (!q.empty()) { pair<int, int> u = q.top(); q.pop(); if (u.first > dist[u.second]) continue; for (int i = 0; i < (int) g[u.second].size(); i++) { int v = g[u.second][i].second, len = g[u.second][i].first; if (dist[v] > dist[u.second] + len) { p[v] = u.second; dist[v] = dist[u.second] + len; q.push(make_pair(dist[v], v)); } } } } Будем уменьшать путь из той вершины, до которой он сейчас минимальный. Алгоритм Дейкстры