Rezolvare completă PbInfo #1604 DMin

Se consideră un graf neorientat conex cu n vârfuri, numerotate de la 1 la n, şi m muchii. Definim distanţa minimă dintre două noduri x şi y ca fiind numărul minim de muchii al unui lanţ elementar care uneşte x cu y.

Cerinţa

Se dau k perechi de vârfuri x y. Determinați pentru fiecare pereche distanța minimă dintre x și y.

Date de intrare

Fişierul de intrare dmin.in conţine pe prima linie două numere n şi m, reprezentând numărul de noduri, respectiv numărul de muchii. Fiecare dintre următoarele m linii va conţine câte două numere x şi y, separate printr-un spaţiu, cu semnificaţia: există o muchie între nodul x şi nodul y.

Următoarea linie conține un număr k, iar următoarele k linii câte două numere x y.

Date de ieşire

Fişierul de ieşire dmin.out va conţine k linii. Fiecare linie va conține distanța minimă dintre nodurile x y din fișierul de intrare, în ordinea din fișierul de intrare.

Restricţii şi precizări

  • n ≤ 100
  • k ≤ 100
  • pentru toate perechile x y există cel puțin un drum elementar de la x la y.

Exemplu

dmin.in

6 7
1 3
1 2
2 3
2 4
3 4
4 5
5 6
3
1 6
5 3
2 5

dmin.out

4
2
2

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

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

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

int n , a[105][105];
int x[105], // coada pentru parcurgerea in latime
    v[105]; // vector caracteristic care precizeaza daca un varf a fost sau nu vizitat
int d[105]; // distanța minimă de la rădăcină la vârfurile grafului
    

void bfs(int varf)
{
    for(int i = 1 ; i <= n ; i ++)
        d[i] = v[i] = x[i] = 0;
    int st, dr;
    st = dr = 1;
    v[varf] = 1;
    x[1] = varf;
    while(st <= dr)
    {
        int k = x[st];
        for(int i = 1; i <= n ; ++i)
            if(v[i] == 0 && a[k][i] == 1)
            {
                dr ++;
                v[i] = 1;
                x[dr] = i;
                d[i] = d[k] + 1;
            }
        st ++;
    }
}

int main()
{
    int i , j , m , k , x , y;
    fin >> n >> m;
    while(m > 0)
    {
        fin >> i >> j;
        a[i][j] = a[j][i] = 1;
        m --;
    }
    fin >> k;
    while(k)
    {
        fin >> x >> y;
        bfs(x);
        fout << d[y] << endl;;
        k --;
    }
    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 #1604 DMin

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