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] << " "; }