You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
134 lines
3.8 KiB
C++
134 lines
3.8 KiB
C++
// g++ -Wall -pedantic -std=c++17 -pthread kenobi.cpp -o kenobi
|
|
#include <iostream>
|
|
#include <iomanip>
|
|
#include <vector>
|
|
#include <map>
|
|
#include <string>
|
|
#include <queue>
|
|
#include <list>
|
|
#include <stack>
|
|
#include <set>
|
|
#include <thread>
|
|
#include <fstream> // getline
|
|
#include <algorithm> // find
|
|
#include <math.h> // ceil
|
|
#include <sys/time.h> // per gettimeofday
|
|
|
|
using namespace std;
|
|
|
|
struct Film {
|
|
string name;
|
|
vector<int> actor_indicies;
|
|
};
|
|
|
|
struct Actor {
|
|
string name;
|
|
vector<int> film_indices;
|
|
};
|
|
|
|
map<int, Actor> A; // Dizionario {actor_id (key): Actor (value)}
|
|
map<int, Film> F; // Dizionario {film_id (value): Film (value)}
|
|
int MAX_ACTOR_ID = -1;
|
|
|
|
void DataRead()
|
|
{
|
|
ifstream actors("data/Attori.txt"); // leggo il file
|
|
ifstream movies("data/FilmFiltrati.txt"); // leggo il file
|
|
|
|
string s,t; // creo delle stringhe per dopo, notazione triste? Si
|
|
const string space /* the final frontier */ = " "; // stringa spazio per dopo
|
|
|
|
for (int i = 1; getline(actors,s); i++)
|
|
{
|
|
if (s.empty()) // serve per saltare le righe vuote, a volte capita
|
|
continue;
|
|
try {
|
|
Actor TmpObj; // creo un oggetto temporaneo della classe Actor
|
|
int id = stoi(s.substr(0, s.find(space)));
|
|
TmpObj.name = s.substr(s.find(space)+1);
|
|
A[id] = TmpObj; // Notazione di Matlab/Python, ma da C++17 funziona
|
|
if (id > MAX_ACTOR_ID)
|
|
MAX_ACTOR_ID = id;
|
|
} catch (...) {
|
|
cout << "Could not read the line " << i << " of Actors file" << endl;
|
|
}
|
|
}
|
|
|
|
for (int i = 1; getline(movies,t); i++)
|
|
{
|
|
if (t.empty())
|
|
continue;
|
|
|
|
try{
|
|
Film TmpObj;
|
|
int id = stoi(t.substr(0, t.find(space)));
|
|
TmpObj.name = t.substr(t.find(space)+1);
|
|
F[id] = TmpObj;
|
|
} catch (...) {
|
|
cout << "Could not read the line " << i << " of Film file" << endl;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Inizio a costruire il grafo
|
|
|
|
void BuildGraph()
|
|
{
|
|
ifstream relations("data/Relazioni.txt");
|
|
string s;
|
|
const string space = " ";
|
|
|
|
for (int i=1; getline(relations,s); i++){ // Scorro relations
|
|
if (s.empty())
|
|
continue;
|
|
try {
|
|
int id_film = stoi(s.substr(0, s.find(space))); // Indice del film
|
|
int id_attore = stoi(s.substr(s.find(space)+1)); // Indice dell'attore
|
|
if (A.count(id_attore) && F.count(id_film)) { // Escludi film e attori filtrati
|
|
A[id_attore].film_indices.push_back(id_film);
|
|
F[id_film].actor_indicies.push_back(id_attore);
|
|
}
|
|
} catch (...) {
|
|
cout << "Could not read the line " << i << " of Releations file" << endl;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Stampo il grafo (i primi max_n_film soltanto)
|
|
void PrintGraph(size_t max_n_film = 100)
|
|
{
|
|
const size_t n = min(max_n_film, F.size()); // Potrebbero esserci meno film di max_n_film
|
|
size_t i = 0;
|
|
for (const auto& [id_film, film] : F) { // Loop sulle coppie id:film della mappa
|
|
cout << id_film << "(" << film.name << ")";
|
|
if (!film.actor_indicies.empty()) {
|
|
cout << ":";
|
|
for (int id_attore : film.actor_indicies)
|
|
cout << " " << id_attore << "(" << A[id_attore].name << ")";
|
|
}
|
|
cout << endl;
|
|
|
|
i++; // Tengo il conto di quanti ne ho stampati
|
|
if (i >= n) // e smetto quando arrivo ad n
|
|
break;
|
|
}
|
|
}
|
|
|
|
// Trova un film in base al titolo, restituisce -1 se non lo trova
|
|
int FindFilm(string title)
|
|
{
|
|
for (const auto& [id, film] : F)
|
|
if (film.name == title)
|
|
return id;
|
|
return -1;
|
|
}
|
|
|
|
// Trova un film in base al titolo, restituisce -1 se non lo trova
|
|
int FindActor(string name)
|
|
{
|
|
for (const auto& [id, actor] : A)
|
|
if (actor.name == name)
|
|
return id;
|
|
return -1;
|
|
}
|