Rezolvare completă PbInfo #477 Lanturi1

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 

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 Lanturi1:

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

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

int n , a[105][105], x[205] , p , q , r;

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

int OK(int k)
{
    if(x[k] == r)
        return 0;
    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 back(int k)
{
    for(int i = 1  ; i <= n ; ++i)
    {
        x[k] = i;
        if(OK(k))
        {
            if(x[k] == q)
                    afis(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 >> r);
    x[1] = p;
    back(2);
    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 #477 Lanturi1

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #477 Lanturi1 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!