几天前,我学习了 Dijkstra 算法,并想学习制作一个新的无向图,该图具有与原始图的最短路径边。
所以我所做的是对 Dijkstra 最短路径算法进行了简单的修改。
#define ll long long
vector <pair<int,long long>> adj[N]; //original graph
vector <int> adjj[N]; //new graph with shortest path edges
void dijkstra(int s)
{
d[s]=0; // array that stores shortest path
priority_queue<pair<ll,int>,vector<pair<ll,int>>,greater<pair<ll,int>>> pq;
pq.push(make_pair(0,s));
while(!pq.empty())
{
int v=pq.top().S;ll dist=pq.top().F;
pq.pop();
if(dist==((long long)(1e18)))
return;
if(dist>d[v])
continue;
if(p[v]!=0) // considering nodes' number start from 1
// new graph made only with shortest paths
adjj[parent[v]].push_back(v),adjj[v].push_back(parent[v]);
for(auto edge : adj[v])
{
int to = edge.first;
ll len = edge.second;
if((len+d[v])<d[to])
{
parent[to]=v;
d[to]=len+d[v];
pq.push(make_pair(d[to],to));
}
}
}
}
所以我在我的一些自定义测试用例上尝试了这段代码,但我不能完全确定这是正确的......如果你能告诉我这是对还是错,那就太好了?