У меня возникли проблемы с поиском кратчайшего пути между двумя URL-адресами. A.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 algo эффективен только в том случае, если стоимость переключения между гиперссылками различна.
Поэтому предпочитайте BFS.
O (V) лучше, чем O ((V + E) log (V + E)) {V-вершины, E-ребра}
Лучше хранить граф в списке смежности идентификаторов с помощью vector <vector <int>>, а не хранить его в векторе <vector <string>>. Используйте массив для идентификации URL-адреса идентификатора.
Для этого вам, вероятно, нужно использовать алгоритм Дейкстры. Вам также нужно будет хранить все ваши данные в какой-либо структуре графика, например.
struct graph_node {
vector<graph_node*> neighbours;
string url;
}
Вы также можете использовать карту, чтобы затем сохранить все указатели value-> graph_node. Затем используйте алгоритм Дейкстры, чтобы найти кратчайший путь после создания графика.