首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dijkstra的算法对于计算单源最短路径最有效吗?

Dijkstra的算法对于计算单源最短路径最有效吗?
EN

Stack Overflow用户
提问于 2016-01-06 06:53:21
回答 1查看 1.1K关注 0票数 3

对于无向图,Dijkstra的单源最短路径算法是最有效的算法吗?我使用这个算法来计算从站1(开始节点)到站N(目的地节点)的公交线路的最低票价。连接中间站的路径有一个指定的车费(边缘权重).Note,该公交线路网络可以有

  • 1<=Stations<=50000
  • 1<=Routes<=500000

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

现在,我的代码的逻辑是合理的,因为在16个测试用例中,只有2个有failed.The失败的原因是测试用例中的图形大小很大,执行时间导致超时。

我需要一些帮助来优化代码(Dijkstra的算法)。如果有其他算法可以更有效地处理大尺寸的图形,那么想知道它是well.Thanks。

EN

回答 1

Stack Overflow用户

发布于 2017-07-22 07:16:58

您可以从队列到优先级队列来优化它。

检查下面的代码

代码语言:javascript
复制
#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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34627298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档