【问题标题】:Shortest path between two nodes in a graph based on a different condition基于不同条件的图中两个节点之间的最短路径
【发布时间】:2016-04-22 16:06:01
【问题描述】:

我试图解决 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 向量会跟踪到目前为止的最小距离。

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

如果你能帮助我解决我目前的方法有什么问题,那就太好了,如果它的运行时间是指数级的,我也有点困惑。 这段代码的运行时间是多少?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2015-06-12
      • 2016-03-04
      • 2021-12-18
      • 1970-01-01
      • 2023-01-15
      • 1970-01-01
      • 2017-04-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多