У меня есть список вершин, которые имеют метки для разных актеров, и список ребер, которые имеют метки для фильмов, соединяющих актеров.Прямо сейчас я пытаюсь создать функцию, которая создает путь между двумя актерами (вершинами) и выводит актеров между ними, а также фильмы, в которых они находятся. Моя функция для этого - бесконечный цикл в некоторой части, и яне могу понять, что с ним не так.
У меня есть эти разные структуры, которые я использую в своем коде.
struct Edge {
string label;
string vertex;
Edge(string v, string l)
{
this->label = l;
this->vertex = v;
}
};
struct Vertex {
string label;
std::vector<Edge*> adjList;
Vertex(string label) {
this->label = label;
}
};
struct pairs
{
string vertex;
string edge;
pairs(string vertex, string edge)
{
this->vertex = vertex;
this->edge = edge;
}
};
struct triple
{
string parent;
string vertex;
string edge;
triple(string parent, string vertex, string edge)
{
this->parent = parent;
this->vertex = vertex;
this->edge = edge;
}
};
Здесь также вводятся ребра и вершины
imdb.vertexInsert("Al Pacino");
imdb.vertexInsert("Robert De Niro");
imdb.vertexInsert("Marlon Brando");
imdb.vertexInsert("Mark Hamill");
imdb.vertexInsert("Harrison Ford");
imdb.vertexInsert("Sean Connery");
imdb.vertexInsert("Kevin Costner");
imdb.vertexInsert("John Cena");
imdb.edgeInsert("The Godfather", "Al Pacino", "Marlon Brando");
imdb.edgeInsert("Heat", "Al Pacino", "Robert De Niro");
imdb.edgeInsert("Star Wars", "Mark Hamill", "Harrison Ford");
imdb.edgeInsert("Indiana Jones", "Harrison Ford", "Sean Connery");
imdb.edgeInsert("The Untouchables", "Sean Connery", "Kevin Costner");
imdb.edgeInsert("The Untouchables", "Robert De Niro", "Kevin Costner");
imdb.edgeInsert("The Untouchables", "Robert De Niro", "Sean Connery");
Вот примеры того, как выглядит ввод / вывод
imdb.print();
imdb.chain("Marlon Brando", "Robert De Niro");
imdb.chain("Sean Connery", "Harrison Ford");
imdb.chain("Kevin Costner", "Al Pacino");
imdb.chain("Mark Hamill", "John Cena");
// Expected output:
//
// Marlon Brando (The Godfather) Al Pacino (Heat) Robert De Niro
// Sean Connery (Indiana Jones) Harrison Ford
// Kevin Costner (The Untouchables) Robert De Niro (Heat) Al Pacino
// Mark Hamill is not connected to John Cena
Тогдаэто цепная функция, которую я пытаюсь заставить работать
bool chain(string start, string dest) {
std::deque<string> q;
q.push_front(start);
std::vector<string> seen;
std::vector<triple*> parent;
std::deque<pairs*> path;
parent.push_back(new triple(start, " ", " "));
while (!q.empty()) {
string curr = q.at(0);
q.pop_front();
seen.push_back(curr);
std::cout << "Now visiting " << curr << std::endl;
if (curr == dest) {
string temp = curr;
int k = 0;
for (k = 0; k < parent.size(); k++)
{
if (parent[k]->vertex == temp)
break;
}
while (temp != start) {
path.push_front(new pairs(parent[k]->vertex, parent[k]->edge));
temp = parent[k]->parent;
}
cout << seen[0];
for (int i = 0; i < path.size(); i++) {
std::cout << "(" << path[i]->edge << ") " << path[i]->vertex;
}
std::cout << std::endl;
return true;
}
int n = 0;
for (; n < vertices.size(); n++)
{
if (vertices[n]->label == curr) break;
}
Vertex* v = vertices[n];
for (int i = 0; i < v->adjList.size(); i++) {
if (!contains(seen, v->adjList[i]->vertex)) {
q.push_back(v->adjList[i]->vertex);
seen.push_back(v->adjList[i]->vertex);
parent.push_back(new triple(curr, v->adjList[i]->vertex, v->adjList[i]->label));
}
}
}
return false;
}
Прямо сейчас это выглядит так, когда я ее запускаю.
Al Pacino: The Godfather Heat
Robert De Niro: Heat The Untouchables The Untouchables
Marlon Brando: The Godfather
Mark Hamill: Star Wars
Harrison Ford: Star Wars Indiana Jones
Sean Connery: Indiana Jones The Untouchables The Untouchables
Kevin Costner: The Untouchables The Untouchables
John Cena:
Now visiting Marlon Brando
Now visiting Al Pacino
Now visiting Robert De Niro