364
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 ≤ 201 ≤ 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