【发布时间】: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