fbpx

Problema #579 – Drum – Rezolvari PBInfo

de Mihai-Alexandru

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;

}
Comentarii

S-ar putea sa iti placa