我试图在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
向量会跟踪到目前为止的最小距离。
但对于一半的测试用例,这个失败了。我无法从输入中找出原因,因为输入文件具有大量边缘并且重新创建它非常困难。
如果你可以帮助我解决当前方法的问题,那将是很好的,如果它的运行时间呈指数级,我也有点困惑。 这段代码的运行时间是多少?
答案 0 :(得分:0)
您错过了这个: 允许多个边缘 。因此,您必须选择要使用的边缘(不一定是具有最小C的边缘)。