Pagini recente » Cod sursa (job #2320167) | Cod sursa (job #697527) | Cod sursa (job #1170927) | Cod sursa (job #1239162) | Cod sursa (job #1805466)
#include <fstream>
#include <vector>
#include <list>
#include <queue>
#include <iterator>
using namespace std;
struct Nod {
int distanta;
bool vizitat;
list<int> idNoduriAdiacente;
Nod() {
distanta = -1;
vizitat = false;
}
};
class Graf {
public:
Graf(vector<Nod> &noduri);
void calculeazaDistanteleLaToateNodurileDeLaNodul(int idNodSursa);
vector<int> getDistante();
private:
void viziteazaNodurileAdiacenteNodului(int idNod);
void viziteazaNod(int idNod, int idNodSursa);
vector<Nod> noduri;
queue<int> deVizitat;
};
Graf::Graf(vector<Nod> &noduri) {
this->noduri = noduri;
}
void Graf::viziteazaNod(int idNod, int idNodSursa) {
noduri[idNod].vizitat = true;
noduri[idNod].distanta = noduri[idNodSursa].distanta + 1;
}
void Graf::viziteazaNodurileAdiacenteNodului(int idNod) {
list<int>::iterator idNodIteratie;
idNodIteratie = noduri[idNod].idNoduriAdiacente.begin();
while (idNodIteratie != noduri[idNod].idNoduriAdiacente.end()) {
if (!noduri[*idNodIteratie].vizitat) {
viziteazaNod(*idNodIteratie, idNod);
deVizitat.push(*idNodIteratie);
}
++idNodIteratie;
}
}
void Graf::calculeazaDistanteleLaToateNodurileDeLaNodul(int idNodSursa) {
noduri[idNodSursa].vizitat = true;
noduri[idNodSursa].distanta = 0;
deVizitat.push(idNodSursa);
while (!deVizitat.empty()) {
int idNodCurent = deVizitat.front();
deVizitat.pop();
viziteazaNodurileAdiacenteNodului(idNodCurent);
}
}
vector<int> Graf::getDistante() {
vector<int> distante(noduri.size() - 1);
for (int i = 0; i < distante.size(); ++i) {
distante[i] = noduri[i + 1].distanta;
}
return distante;
}
int main(int argc, char *argv[]) {
ifstream fin("bfs.in");
int n, m, s;
fin >> n >> m >> s;
vector<Nod> noduri(n+1);
int i = 0;
while (i < m) {
int x, y;
fin >> x;
fin >> y;
noduri[x].idNoduriAdiacente.push_back(y);
i += 1;
}
fin.close();
Graf graf(noduri);
ofstream fout("bfs.out");
graf.calculeazaDistanteleLaToateNodurileDeLaNodul(s);
vector<int> distante = graf.getDistante();
for (unsigned i = 0; i < distante.size() - 1; ++i) {
fout << distante[i] << " ";
}
fout << distante[distante.size() - 1] << "\n";
fout.close();
return 0;
}