#include #include #include #include // Kuba Pelc using namespace std; stack reseni; vector *sousede; char *pismena; // Rekurzivně (brute-force) najde požadovanou cestu grafem bool Hledej(int kruh, int veSlove, string* slovo) { bool uspech = false; for(int i = 0; i < sousede[kruh].size(); i++) { int soused = sousede[kruh][i]; if(pismena[soused] == slovo->at(veSlove + 1)) { if(veSlove == slovo->length() - 2) { // Pokud jsme našli cestu grafem, která tvoří heslo, tak vrátíme true a do řešení vypíšeme poslední vrchol cesty (řešení tvoříme pozpátku) uspech = true; reseni.push(soused); break; } if(Hledej(soused, veSlove + 1, slovo)) { uspech = true; break; } } } if(uspech) { // Do řešení přidáme aktuální vrchol reseni.push(kruh); return true; } return false; } int main() { int n, m, s; cin >> n; cin >> m; cin >> s; sousede = new vector[n]; pismena = new char[n]; string slovo; cin >> slovo; for(int i = 0; i < n; i++) { int soused = -1; cin >> pismena[i]; while(true) { cin >> soused; if(soused == -1) break; sousede[i].push_back(soused); } } Hledej(s, 0, &slovo); // Řešení ve správném pořadí vypíšeme while(reseni.size() > 0) { cout << reseni.top(); cout << endl; reseni.pop(); } return 0; }