[英]Error in Dijkstra's shortest path algorithm implementation (using C++ STL)
我嘗試使用 std::priority_queue 在 C++ 中實現 Dijkstra 的算法。function “dijsktra”將輸入作為 2 個節點,源頂點和目標頂點。 但是,我每次都得到不正確的答案。 請幫幫我,告訴我哪里出錯了。 我的代碼-
#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstdlib>
#include <stdio.h>
#include <vector>
#include <numeric>
#include <set>
#include <map>
#include <queue>
#define inf 9999999
using namespace std;
map <int,int> vis;
vector <vector <pair <int,int> > > adj(100);
vector <int> dist(100);
void dijkstra(int u,int t)
{
priority_queue <pair <int,int> > q;
int b,w,i;
q.push({0,u});
vis[u]=1;
while(!q.empty())
{
u = q.top().second; q.pop();
if(!vis[u])
{
vis[u]=1;
for(i=0;i<adj[u].size();i++)
{
b = adj[u][i].first; w = adj[u][i].second;
if(dist[b]>dist[u]+w)
{
dist[b] = dist[u] + w;
q.push({-dist[b],b});
}
}
}
}
cout << dist[t];
}
int main()
{
int i,j,k,n,m,x,y,w,t;
cin >> n >> m;
for(i=0;i<m;i++)
{
cin >> x >> y >> w;
adj[x].push_back({y,w});
adj[y].push_back({x,w});
}
cin >> t;
for(i=1;i<=n;i++)
{
dist[i]=inf;
}
dijkstra(1,t);
}
錯誤:
由於vis[u] = 1
永遠不會讓您進入 for 循環,您的代碼無法正常工作。
實際上,在Dijkstra algorithm
中不需要visited array
(至少在這種情況下)。 但是在這里使用visited array
會降低時間復雜度,當有負邊緣時會很棘手,所以要小心。
#include <iostream>
#include <vector>
#include <queue>
#define inf 9999999
std::vector <std::vector <std::pair <int,int> > > adj(100);
std::vector <int> dist(100);
void dijkstra(int u,int t)
{
std::priority_queue <std::pair<int, int>> q;
int b, w, i;
q.push({0, u});
while(!q.empty()) {
u = q.top().second;
q.pop();
for(i = 0; i < adj[u].size(); i++) {
b = adj[u][i].first; w = adj[u][i].second;
if(dist[b] > dist[u] + w) {
dist[b] = dist[u] + w;
q.push({-dist[b], b});
}
}
}
std::cout << dist[t];
}
int main()
{
int i, n, m, x, y, w, t;
std::cin >> n >> m;
for(i = 0;i < m; i++) {
std::cin >> x >> y >> w;
adj[x].push_back({y, w});
adj[y].push_back({x, w});
}
std::cin >> t;
for(i = 0; i < n; i++) {
dist[i] = inf;
}
// making the source distance to 0
dist[0] = 0;
dijkstra(0,t);
}
問題是vis[u]=1;
就在q.push({0,u});
之后 .
因此,檢查if(!vis[u])
無法通過,並且不會處理任何節點。
你應該做dist[u]=0;
而不是那個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.