基于不同条件的图中两个节点之间的最短路径

时间:2016-04-22 16:06:02

标签: graph dijkstra adjacency-list breadth-first-search

我试图在Hackerrank上解决this问题。最初,我认为这将是Dijkstra的直接实施,但事实并非如此。

我写的代码是

#include <iostream>
#include <algorithm>
#include <climits>
#include <vector>
#include <set>
using namespace std;

typedef struct edge { unsigned int to, length; } edge;

int dijkstra(const vector< vector<edge> > &graph, int source, int target) {
    vector< int > min_distance(graph.size(), INT_MAX);
    min_distance[ source ] = 0;
    std::vector< bool > visited(graph.size(), false);
    set< pair<int,int> > active_vertices;
    active_vertices.insert( {0,source} );
    while (!active_vertices.empty()) {
        int where = active_vertices.begin()->second;
        int where_distance = active_vertices.begin()->first;
        visited[where] = true;
        active_vertices.erase( active_vertices.begin());
        for (auto edge : graph[where])
        {
          if(!visited[edge.to])
          {
            int cost = where_distance | edge.length;
            min_distance[edge.to] = min(cost, min_distance[edge.to]);
            active_vertices.insert({cost, edge.to});
          }
        }
    }
   return min_distance[target];
}

 int main( int argc, char const *argv[])
{
    unsigned int n, m, source, target;
        cin>>n>>m;
        std::vector< std::vector<edge> > graph(n, std::vector<edge>());
        while(m--)
        {
            unsigned int from, to, dist;
            cin>>from>>to>>dist;
            graph[from-1].push_back({ to-1, dist});
            graph[to-1].push_back({from-1, dist});
        }
        cin>>source>>target;
        cout<<dijkstra(graph, source-1, target-1)<<endl;
    return 0;
}

我的方法非常简单。在每个顶点,我使用它的传出边缘,并使用它的更新成本更新active_vertices,前提是尚未访问顶点。此外,min_distance向量会跟踪到目前为止的最小距离。

但对于一半的测试用例,这个失败了。我无法从输入中找出原因,因为输入文件具有大量边缘并且重新创建它非常困难。

如果你可以帮助我解决当前方法的问题,那将是很好的,如果它的运行时间呈指数级,我也有点困惑。 这段代码的运行时间是多少?

1 个答案:

答案 0 :(得分:0)

您错过了这个: 允许多个边缘 。因此,您必须选择要使用的边缘(不一定是具有最小C的边缘)。