Pagini recente » Cod sursa (job #1019208) | Borderou de evaluare (job #2056588) | Cod sursa (job #2436267) | Cod sursa (job #859194) | Cod sursa (job #2231217)
#include <iostream>
#include <fstream>
#include <queue>
#define MAX_N 100005
using namespace std;
struct Nod
{
int val;
Nod* next = NULL;
};
ifstream fin("bfs.in");
ofstream fout("bfs.out");
int n, m, s;
Nod* lista[MAX_N] = { NULL };
int distante[MAX_N] = { 0 };
queue<int> nodeQueue;
Nod* Adauga(Nod* nod, int val)
{
Nod* current = nod;
if (!nod)
{
nod = new Nod();
}
current = nod;
while (current->next != NULL)
{
current = current->next;
}
Nod* newNod = new Nod();
newNod->val = val;
newNod->next = NULL;
current->next = newNod;
return nod;
}
void BFS()
{
nodeQueue.push(s);
distante[s] = 0;
int crtNod = s;
int distanta = distante[s];
while (!nodeQueue.empty())
{
crtNod = nodeQueue.front();
nodeQueue.pop();
distanta = distante[crtNod];
Nod* nod = lista[crtNod];
while (nod)
{
int newDist = distanta + 1;
if (distante[nod->val] == -1 || newDist < distante[nod->val])
{
distante[nod->val] = newDist;
nodeQueue.push(nod->val);
}
nod = nod->next;
}
}
}
int main(void)
{
fin >> n >> m >> s;
for (int i = 0; i < m; i++)
{
int n1, n2;
fin >> n1 >> n2;
lista[n1] = Adauga(lista[n1], n2);
}
for (int i = 1; i <= n; i++)
{
distante[i] = -1;
}
BFS();
for (int i = 1; i <= n; i++)
{
fout << distante[i] << " ";
}
fin.close();
fout.close();
return 0;
}