【问题标题】:Is Dijkstra's algorithm most efficient for computing single-source shortest path?Dijkstra 算法对于计算单源最短路径是否最有效?
【发布时间】:2016-04-10 04:47:08
【问题描述】:

对于无向图来说,寻找单源最短路径的 Dijkstra 算法是最有效的算法吗?我正在使用此算法来计算从车站 1(起始节点)到车站 N(目的地节点)的公交路线的最低票价。连接中间车站的路径有一个票价分配(边权重)。注意,公交路线网络可以有

  • 1
  • 1

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

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

我可以使用一些帮助来优化代码(Dijkstra 算法)。如果有其他算法可以更有效地处理大尺寸图,也想了解一下。谢谢。

【问题讨论】:

  • A* search 可能更快?
  • 如果你有好的启发式函数,也许A*更好en.wikipedia.org/wiki/A*_search_algorithm
  • 用地标和三角不等式查找 A-star,也称为首字母缩略词 ALT path-finding
  • 用地标和三角不等式查找 A-star,也称为首字母缩略词 ALT path-finding。这将解释如何构建和使用合适的(即可接受的)启发式来实现您的性能要求。 Dijkstra 的算法通常是 O(N^2) 性能。
  • 复杂度 Dijkstra 算法O(E log V) 与“标准”实现(带有优先级队列)。你也可以看看en.wikipedia.org/wiki/Shortest_Path_Faster_Algorithm

标签: algorithm graph-theory dijkstra


【解决方案1】:

你可以一个队列到优先队列来优化它。

检查下面的代码

#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;
}

【讨论】:

    猜你喜欢
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-03
    • 2016-07-30
    • 2016-01-11
    • 2021-04-18
    相关资源
    最近更新 更多