Dijkstra的查找单源最短路径的算法是无效图的最有效算法吗?我正在使用此算法计算从站1(起始节点)到站N(目的节点)的总线路由的最小票价。连接中间站的路径具有分配的票价(边缘权重)。注意,总线路由网络可以具有
问题的详细信息可以在这里找到 - https://www.hackerrank.com/challenges/jack-goes-to-rapture
现在,我的代码的逻辑似乎是合理的,因为16个测试用例中只有2个失败。失败的原因是测试用例中的图形大小很大。因此,我的代码处理时间超过了指定的时间限制,导致超时。
我可以帮助理解如何优化我的代码(Dijkstra算法),或者是否有其他算法对大尺寸图形更有效。感谢。
答案 0 :(得分:0)
您可以将队列设置为优先级队列来优化它。
检查以下代码
#include<bits/stdc++.h>
#define mod 1000000000000
using namespace std;
typedef long long int ll;
typedef long double ld;
vector<ll> pred1,pred2;
vector<ll> dist1,dist2;
vector<ll> vis1,vis2;
vector< pair<ll,ll> > v[100005];
class compare{
public:
bool operator()(pair<ll,ll> x,pair<ll,ll> y)
{
return x.second>y.second;
}
};
bool cmp(ll x,ll y)
{
return x>y;
}
int main()
{
ll n,k,x,y,d;
cin>>n>>k;
pred1.clear();
dist1.clear();
vis1.clear();
dist1.resize(n+5);
vis1.resize(n+5);
pred1.resize(n+5);
for(ll i=0;i<=n;i++)
{
dist1[i]=mod;
pred1[i]=0;
v[i].clear();
}
for(ll i=0;i<k;i++)
{
cin>>x>>y>>d;
v[x].push_back(make_pair(y,d));
v[y].push_back(make_pair(x,d));
}
ll a,b;
a=1;
b=n;
dist1[a]=0;
priority_queue< pair<ll,ll> , vector< pair<ll,ll> > , compare > q;
pair<ll,ll> p={a,0};
q.push(p);
while(q.size()!=0)
{
p=q.top();
q.pop();
if(vis1[p.first]==true)
continue;
vis1[p.first]=true;
ll idx=p.first;
for(ll i=0;i<v[idx].size();i++)
{
if(dist1[v[idx][i].first]>dist1[idx]+( (v[idx][i].second-dist1[idx]>=0) ? (v[idx][i].second-dist1[idx]) : 0 ) )
{
dist1[v[idx][i].first]=dist1[idx]+( (v[idx][i].second-dist1[idx]>=0) ? (v[idx][i].second-dist1[idx]) : 0 );
q.push(make_pair(v[idx][i].first,dist1[v[idx][i].first]));
pred1[v[idx][i].first]=idx;
}
}
}
if(dist1[b]==mod)
{
cout<<"NO PATH EXISTS\n";
return 0;
}
cout<<dist1[b]<<"\n";
return 0;
}