URL的最短路径算法

时间:2014-07-23 01:53:47

标签: c++ algorithm

我在找到两个网址之间的最短路径时遇到问题。我们提供的.csv列出了一些用逗号分隔的网站。每个网站都可以访问该页面上超链接中的下一个网站。例如,如果文件读取espn.com,espn.com / nba,espn.com / nbaschedules,您可以从espn.com转到nba页面,从nba页面转到nba时间表。我的工作是找到从一个网站到另一个网站的最少点击次数。这是我到目前为止存储文件的方式。我正在使用的是用于存储的STL unordered_map。

ifstream inFile;
ofstream outFile;
inFile.open("urls.csv");
string line;
unordered_map<string, vector<string>> urlAdjList;
while(getline(inFile, line))  //Reads each line one at a time.
{
    int firstWord = 0;
    istringstream iss(line);
    string firstURL, url;
    while(iss >> url)
    {
        if(firstWord == 0 && url != "|")
        {
            firstURL = url;
            urlAdjList[firstURL];
            firstWord = 1;
                outFile << firstURL << endl;
        }
        else
            urlAdjList[firstURL].push_back(url);
    }
}
//Find the shortest path between mURL and nURL?

我的问题是我存储正确吗?我需要使用Dijkstra算法或广度优先搜索吗?

2 个答案:

答案 0 :(得分:1)

只有在超链接之间切换的成本不同时,Dijkstra的算法才有效。

所以更喜欢BFS。

O(V)优于O((V + E)log(V + E)){V-vertices,E-edges}

最好使用vector&lt;将图形存储在id的邻接列表中。矢量&lt; int&gt; &GT;而不是将其存储在矢量&lt;矢量&lt;字符串&gt;取代。使用数组来标识id的URL。

答案 1 :(得分:0)

你可能需要使用Dijkstra的算法。您还需要将所有数据存储在某种图形结构中,例如

struct graph_node {
    vector<graph_node*> neighbours;
    string url;
}

您还可以使用地图然后存储所有value-&gt; graph_node指针。然后使用Dijkstra算法在构建图形后找到最短路径。