336
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 ≤ 101 ≤ 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;
}
Comentarii