如何确定两个节点是否相互连接?

时间:2016-11-29 18:31:46

标签: c++ algorithm

此代码查找最短路径,但不考虑是否可以到达目的地。在运行此功能之前,如何检查目的地是否可达?

   void Trains::shortestPath(int src, int dest)
{
    set< pair<int, int> > setds;
    vector<int> dist(V, INF);
    setds.insert(make_pair(0, src));
    dist[src] = 0;
    while (!setds.empty())
    {
        pair<int, int> tmp = *(setds.begin());
        setds.erase(setds.begin());
        int u = tmp.second;
        list< pair<int, int> >::iterator i;
        for (i = adj[u].begin(); i != adj[u].end(); ++i)
        {
            int v = (*i).first;
            int weight = (*i).second;
            if (dist[v] > dist[u] + weight)
            {
                if (dist[v] != INF)
                    setds.erase(setds.find(make_pair(dist[v], v)));
                dist[v] = dist[u] + weight;
                setds.insert(make_pair(dist[v], v));
            }
        }
    }
    printf("Vertex   Distance from Source\n");
        printf("%d \t\t %d\n", dest, dist[dest]);
}

输出:

Vertex   Distance from Source
4        73

如果您想查看所有代码,可以从http://www.geeksforgeeks.org/dijkstras-shortest-path-algorithm-using-set-in-stl/略微修改。

1 个答案:

答案 0 :(得分:1)

简单方法是从源运行dfs并且监视节点目标被访问,它在Dijkstra算法之前在O(N + M)中运行。
如果你的图不是面向的,则将其拆分为连接组件一次通过O(N + M)并在运行算法之前检查,如果源和目标在相同的组件中由O(1)。

建议:
更好地使用priority_queue代替设置,它会更快。