/* Romeo Rizzi 5/2/2014 */ // Assume file di input e file di output non malformati. #include #include #include #include #include #include #include #include using namespace std; const int MAX_N = 100000; int d[MAX_N]; int papi[MAX_N]; bool rec[MAX_N]; ifstream fin; // File di input ifstream fcor; // File di output ifstream fout; // File da correggere void ex (const char *msg, float res) { if (msg) cerr << msg; cout << res << endl; exit (0); } template T safe_read (istream& source, const T& lower = numeric_limits::min (), const T& upper = numeric_limits::max ()) { // Legge un valore da source, assicurandosi che sia tra lower e upper if (lower > upper) { cerr << "safe_read chiamato con parametri errati: " << lower << " " << upper << "\n"; exit (1); } T x; source >> x; if (source.fail () || source.eof ()) ex ("Output malformato", 0.0f); if (x < lower || x > upper) ex ("Output invalido", 0.0f); return x; } void check_fine_file () { string x; fout >> x; if (!fout.eof ()) ex ("Output malformato: il file prosegue oltre.", 0.0f); } int main(int argc, char *argv[]) { if (argc < 4) { cerr << "Usage: " << argv[0] << " " << endl; return 1; } fin.open (argv[1]); fcor.open (argv[2]); fout.open (argv[3]); if (fin.fail()) { cerr << "Impossibile aprire il file di input " << argv[1] << "." << endl; return 1; } if (fcor.fail()) { cerr << "Impossibile aprire il file di output OK " << argv[2] << "." << endl; return 1; } if (fout.fail()) { ex ("Impossibile aprire il file di output generato dal codice sottoposto al problema.", 0.0); } int n = safe_read (fin); int m = safe_read (fin); for (int i = 1; i < n; i++) { d[i] = safe_read (fcor, 0); if( d[i] != safe_read (fout, 0) ) ex ("Differisce in distanza di un nodo.", 0.0f); } cout << "Distanze OK. "; for (int i = 1; i < n; i++) { papi[i] = safe_read (fcor, 0); papi[i] = safe_read (fout, 0); rec[i] = false; } for (int i = 0; i < m; i += 1) { int u = safe_read (fin, 0); int v = safe_read (fin, 0); int w = safe_read (fin, 0); if( (u == papi[v]) && (w == d[v] -d[u]) ) rec[v] = true; } for (int i = 1; i < n; i++) if( !rec[i] ) ex ("Problemi nel vettore dei padri.", 0.0f); cout << "vettore dei padri OK. "; int num_cor = safe_read (fcor); int num_out = safe_read (fout, 0); if (num_cor != num_out) ex ("Differisce nel numero di soluzioni ottime.", 0.0f); else cout << "numero soluzioni ottime OK. "; check_fine_file (); ex ("Corretto!!!", 1.0f); return 0; }