Dijkstra算法在计算单源最短路径方面效率最高吗?

时间:2016-01-06 06:53:21

标签: algorithm graph-theory dijkstra

Dijkstra的查找单源最短路径的算法是无效图的最有效算法吗?我正在使用此算法计算从站1(起始节点)到站N(目的节点)的总线路由的最小票价。连接中间站的路径具有分配的票价(边缘权重)。注意,总线路由网络可以具有

  • 1·=台与LT; = 50000
  • 1·=路线及LT = 500000

问题的详细信息可以在这里找到 - https://www.hackerrank.com/challenges/jack-goes-to-rapture

现在,我的代码的逻辑似乎是合理的,因为16个测试用例中只有2个失败。失败的原因是测试用例中的图形大小很大。因此,我的代码处理时间超过了指定的时间限制,导致超时。

我可以帮助理解如何优化我的代码(Dijkstra算法),或者是否有其他算法对大尺寸图形更有效。感谢。

1 个答案:

答案 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;
}