Depura 89.47/100

Oggi mi ritrovo davanti al problema depura. Utilizzando la soluzione illustrata nel libro di bugatti, l’algoritmo fa 89.47/100 perché va in timeout nei testcase 9 e 16. Pure utilizzando un vettore con valori booleani invece di un set (quindi rendendo la ricerca costante, invece di logaritmica), il mio programma fa comunque 89.47/100

Questo è il mio codice.

#pragma GCC optimize ("Ofast")
#pragma GCC optimization ("unroll-loops")
#include <bits/stdc++.h>
#define MAXK_R 1001
#define MAX_A 2001

using namespace std;
int K;
int R;
bool inAcqua[MAX_A] = { 0 };
list<int> connected[MAX_A];
int added = 0;

bool solve(int node) {
	if (inAcqua[node] == true) return true;
	bool verified = true;
	for (list<int>::iterator x = connected[node].begin(); x != connected[node].end(); x++) {
		if (connected[*x].size() == 0 && inAcqua[*x] == false) return false;
		verified *= solve(*x);
	}
	if (verified) {
		added++;
		inAcqua[node] = true;
	}
	return verified;
}

int main() {
	ifstream cin("input.txt");
	ofstream cout("output.txt");
	cin >> K >> R;
	for (int i = 1; i <= K; i++) {
		int tmp;
		cin >> tmp;
		inAcqua[tmp] = true;
	}
	for (int i = 1; i <= R; i++) {
		int tmp;
		cin >> tmp;
		int n;
		cin >> n;
		for (int j = 0; j < n; j++) {
			int tmp2;
			cin >> tmp2;
			connected[tmp].push_back(tmp2);
		}
	}
	if (solve(1)) {
		cout << added << endl;
	} else {
		cout << -1 << endl;
	}
}

Problema risolto: nel for dove itero per la lista di adiacenza, ho aggiunto una condizione if che esce dal loop se verified diventa falso. Cosí fa 100/100 :pensive:

1 Mi Piace