fbpx

Problema #477 – Lanturi1 – Rezolvari PBInfo

de Mihai-Alexandru

Cerinţa

Se dă lista muchiilor unui graf neorientat cu n vârfuri și trei vârfuri p q r. Să se determine toate lanțurile elementare cu extremitățile în p și q care nu conțin vârful r.

Date de intrare

Fişierul de intrare lanturi1.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 trei numere p q r, cu semnificația precizată.

Date de ieşire

Fişierul de ieşire lanturi1.out va conține, în ordine lexicografică, toate lanțurile elementare cu extremitățile în p, respectiv q, care nu conțin vârful r , fiecare lanț fiind afișat pe câte o linie a fișierului, vârfurile dintr-un lanț fiind separate prin exact un spațiu.

Restricţii şi precizări

  • 1 ≤ n ≤ 20
  • 1 ≤ i , j ≤n
  • muchiile se pot repeta în fișierul de intrare
  • 1 ≤ p , q , r ≤ n
  • p, q și r sunt diferite

Exemplu

lanturi1.in

5 8
1 4 
1 3 
3 5 
4 5 
2 4 
1 2 
4 2 
3 4
2 5 3

lanturi1.out

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

using namespace std;

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

vector <int>G[101];

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

void afisare(int k)
{
    maxi = k;
    int ok = 0;
    for(int i = 1 ; i <= k ; i++)
        if(X[i] == r) ok = 1;

    if(ok == 0)
    {
        for(int i = 1 ; i <= k ; i++)
            cout << X[i] << " ";
        cout << '\n';
    }
}

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)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 >> r;
    X[1] = p;
    P[p] = 1;
    back(2);
}
Comentarii

S-ar putea sa iti placa