# PBinfo #1604 – DMin – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: andrei

## Enunț

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 lanț 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

## Cod sursă C++

```cpp
#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;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/1604)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/1604/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-1604/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
