fbpx

Problema #479 – LantMaxim – Rezolvari PBInfo

de Mihai-Alexandru

Cerinţa

Se dă lista muchiilor unui graf neorientat cu n vârfuri și două vârfuri p q. Să se determine cel mai lung lanț elementar cu extremitățile p și q.

Date de intrare

Fişierul de intrare lantmaxim.in conţine pe prima linie numerele n și m, reprezentând numărul de vârfuri ale grafului și numărul de muchii date în continuare. Fiecare dintre următoarele m linii conține câte o pereche de numere i j, cu semnificația că există muchie între i și j.

Următoarea linie conține două numere p q.

Date de ieşire

Fişierul de ieşire lantmaxim.out va conține cel mai lung lanț elementar cu extremitățile p și q, vârfurile sale fiind separate prin exact un spațiu. Dacă sunt mai multe lanțuri de lungime maximă, se va afișa primul în ordine lexicografică.

Restricţii şi precizări

  • 1 ≤ n ≤ 20
  • 1 ≤ i , j ≤n
  • muchiile se pot repeta în fișierul de intrare
  • 1 ≤ p , q ≤ n
  • pentru toate datele de test, va exista cel puțin un lanț cu extremitățile p q

Exemplu

lantmaxim.in

5 7
1 4 
1 3 
3 5 
4 5 
1 2 
4 2 
3 4
2 5

lantmaxim.out

2 1 3 4 5 
#include <bits/stdc++.h>

using namespace std;

ifstream cin("lantmaxim.in");
ofstream cout("lantmaxim.out");

vector <int>G[101];

int n , m , x , y , P[30] , X[30] , p , q , rez[30] , maxi;

void afisare(int k)
{
    maxi = k;
    for(int i = 1 ; i <= k ; i++)
        rez[i] = X[i];
}

int ok(int k)
{
    int ok = 0;
    for(auto x:G[X[k]])
        if(x == X[k - 1]) ok++;
    if(ok != 0)return 1;
    else return 0;
}

void back(int k)
{
    for(int i = 1 ; i <= n ; i++)
        if(!P[i])
        {
            P[i] = 1;
            X[k] = i;
            if(ok(k))
                if(X[k] == q && k > maxi)afisare(k);
                else back(k + 1);
            P[i] = 0;
        }
}

int main()
{
    cin >> n >> m;
    for(int i = 1 ; i <= m ; i++)
    {
        cin >> x >> y;
        G[x].push_back(y);
        G[y].push_back(x);
    }
    cin >> p >> q;
    X[1] = p;
    P[p] = 1;
    back(2);

    for(int i = 1 ; i <= maxi ; i++)
        cout << rez[i] << " ";
}
Comentarii

S-ar putea sa iti placa