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)); } } } } Будем уменьшать путь из той вершины, до которой он сейчас минимальный. Алгоритм Дейкстры
алгоритму A* • эвристический подход к увеличению скорости алгоритма Дейкстры • алгоритм поиска по первому лучшему совпадению, но при выборе вершины учитывается весь пройденный до неё путь • f(x) = g(x) + h(x) A*
{ int u = graph->edge[i].src; int v = graph->edge[i].dest; int weight = graph->edge[i].weight; if (dist[u] != INT_MAX && dist[u] + weight < dist[v]) { printf("Граф содержит цикл отрицательного веса"); return; } } printArr(dist, V); return; } void BellmanFord(struct Graph* graph, int src) { int V = graph->V; int E = graph->E; int dist[V]; for (int i = 0; i < V; i++) dist[i] = INT_MAX; dist[src] = 0; for (int i = 1; i <= V - 1; i++) { for (int j = 0; j < E; j++) { int u = graph->edge[j].src; int v = graph->edge[j].dest; int weight = graph->edge[j].weight; if (dist[u] != INT_MAX && dist[u] + weight < dist[v]) dist[v] = dist[u] + weight; } } Алгоритм Форда-Беллмана