# PBinfo #579 – Drum Hamiltonian – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: andrei

## Enunț

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

## Cod sursă C++

```cpp
#include <iostream>
#include <fstream>
#include <cassert>
using namespace std;
ifstream fin("drum_hamiltonian.in");
ofstream fout("drum_hamiltonian.out");
int n , a[12][12], x[12] , p, gasit = 0;
void afis(int k)
{
	fout << "1\n";
	for(int  i = 1 ; i <= k ; ++ i)
		fout << x[i] << " ";
	gasit = 1;
}
int OK(int k)
{
	if(k > 1)
		if(a[x[k-1]][x[k]] != 1)
			return 0;
	for(int i = 1 ; i < k ; ++i)
		if( x[k] == x[i] )
			return 0;
	return 1;
}
void back(int k)
{
	for(int i = 1  ; i <= n && ! gasit ; ++i)
	{
		x[k] = i;
		if( OK(k) )
			if( k == n )
				afis(k);
			else
				back(k + 1);
	}
}
int main()
{
    int i , j;
    fin >> n;
    while(fin >> i >> j)
		a[i][j] = 1;
	back(1);
	if(!gasit)
		fout << 0;
	return 0;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/579)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/579/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-579/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
