我在找到两个网址之间的最短路径时遇到问题。我们提供的.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算法或广度优先搜索吗?
答案 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算法在构建图形后找到最短路径。