Mi da sia problemi sulla memoria (non supero il limite, quindi sicuramente qualche indice), ed un altro su TLE ma gli output sempre giusti. Consigli?
#include <iostream>
#include <vector>
using namespace std;
vector<bool> controllo; //lista dei visitati
vector<vector<short>> adj; //lista di adiacenza
void DFS(short nodo) { //DFS normale
controllo[nodo] = true;
for(short i = 0; i < adj[nodo].size(); ++i) {
if(!controllo[adj[nodo][i]]) {
DFS(adj[nodo][i]);
}
}
}
int main() {
ios_base::sync_with_stdio(0); cin.tie(0);
freopen("input.txt", "r", stdin);
short n, m;
cin >> n >> m;
vector<vector<pair<bool, short>>> matrix(n, vector<pair<bool, short>>(m));
vector<short> check;
vector<pair<short, short>> da_vedere;
short nodo = 0;
for(short i = 0; i < n; ++i) {
for(short j = 0; j < m; ++j) {
cin>>matrix[i][j].first; //prendo in input se e' un isola o no
if(matrix[i][j].first) { //se lo e'
matrix[i][j].second = nodo; //mi salvo il numero del nodo
if(i == 0 || i == n-1 || j == 0 || j == m-1) check.push_back(nodo); //e se e' una penisola lo salvo in quelli da controllare
da_vedere.push_back({i, j}); //salvo le coordinate per poi salvarmelo nella lista di adiacenza
++nodo;
}
}
}
adj.resize(nodo);
/* nella prima parte dell'if controllo se non fuoriesco dai limiti
poi vado a vedere nelle 4 direzioni se c'e' un altra isola */
for(short i = 0; i < da_vedere.size(); ++i) { //salvo il nodo nella lista di adiacenza
if(da_vedere[i].first -1 > -1 && matrix[da_vedere[i].first-1][da_vedere[i].second].first) {
adj[i].push_back(matrix[da_vedere[i].first-1][da_vedere[i].second].second);
}
if(da_vedere[i].second -1 > -1 && matrix[da_vedere[i].first][da_vedere[i].second-1].first) {
adj[i].push_back(matrix[da_vedere[i].first][da_vedere[i].second-1].second);
}
if(da_vedere[i].first + 1 < n && matrix[da_vedere[i].first+1][da_vedere[i].second].first) {
adj[i].push_back(matrix[da_vedere[i].first+1][da_vedere[i].second].second);
}
if(da_vedere[i].second + 1 < m && matrix[da_vedere[i].first][da_vedere[i].second+1].first) {
adj[i].push_back(matrix[da_vedere[i].first][da_vedere[i].second+1].second);
}
}
controllo.resize(nodo, false);
for(short i = 0; i < check.size(); ++i)
if(!controllo[check[i]])
DFS(check[i]); //faccio una DFS per ogni penisola
short ans = 0;
for(short i = 0; i < nodo; ++i)
if(!controllo[i]) {
DFS(i); //faccio partire una DFS per ogni isola rimanente che lo sara' sicuramente
ans++;
}
cout << ans << endl;
return 0;
}