Rezolvare completă PbInfo #479 LantMaxim

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 

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema LantMaxim:

#include <iostream>
#include <fstream>
#include <cassert>
using namespace std;

ifstream fin("lantmaxim.in");
ofstream fout("lantmaxim.out");

int n , a[105][105], x[105] , p , q, xmax[105], kmax = 0;

void afis(int x[], int k)
{
    for(int  i = 1 ; i <= k ; ++ i)
        fout << x[i] << " ";
    fout << "
";
}

int OK(int k)
{
    if(a[x[k-1]][x[k]] != 1)
        return 0;
    for(int i = 1 ; i < k ; ++i)
        if( x[k] == x[i] )
            return 0;
    return 1;
}

void verifica(int k)
{
    if(k > kmax)
    {
        kmax = k;
        for(int i = 1; i <= k ; ++i)
            xmax[i] = x[i];
    }
}

void back(int k)
{
    for(int i = 1  ; i <= n ; ++i)
    {
        x[k] = i;
        if(OK(k))
        {
            if(x[k] == q)
                verifica(k);
            else
                back(k + 1);
        }
    }
}

int main()
{
    int i , j , m;
    fin >> n >> m;
    while(m > 0)
    {
        fin >> i >> j;
        a[i][j] = a[j][i] = 1;
        m --;
    }
    assert(fin >> p >> q);
    x[1] = p;
    back(2);
    afis(xmax , kmax);
    return 0;
}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #479 LantMaxim

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #479 LantMaxim de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!