Cerința
Se dă un graf orientat cu n
noduri. Determinați, dacă există, un drum hamiltonian – drum elementar care conține toate nodurile.
Date de intrare
Fișierul de intrare drum_hamiltonian.in
conține pe prima linie numărul n
, iar pe a următoarele linii perechi de numere i j
, cu semnificația că există arc de la i
la j
.
Date de ieșire
Fișierul de ieșire drum_hamiltonian.out
va conține pe prima linie numărul 1
, dacă s-a determinat un drum hamiltonian, respect nu 0
, în caz contrar. Dacă s-a determinat un drum hamiltonian, pe linia următoare se vor afișa nodurile acestui drum, separate prin exact un spațiu.
Restricții și precizări
1 ≤ n ≤ 10
1 ≤ i,j ≤ n
- orice drum hamiltonian afișat corect va fi acceptat
Exemplu
drum_hamiltonian.in
5 1 5 2 1 2 5 3 1 4 2 5 3
drum_hamiltonian.out
1 4 2 1 5 3
#include <bits/stdc++.h> using namespace std; ifstream cin("drum_hamiltonian.in"); ofstream cout("drum_hamiltonian.out"); int n , a[101][101] , ok , x[101] , x1 , y , p[101] , rez[101]; void afisare() { for(int i = 1 ; i <= n ; i++) rez[i] = x[i]; ok = 1; } void back(int k) { for(int i = 1 ; i <= n && !ok; i++) if(!p[i]) { x[k] = i; p[i] = 1; if(k == 1 || a[x[k - 1]][x[k]] == 1) { if(k == n) afisare(); else back(k + 1); } p[i] = 0; } } int main() { cin >> n; while(cin >> x1 >> y) a[x1][y] = 1; back(1); if(ok == 1) { cout << 1 << '\n'; for(int i = 1 ; i <= n ; i++) cout << rez[i] << " "; } else cout << 0; }