Pagini recente » Cod sursa (job #141063) | Cod sursa (job #134030) | Cod sursa (job #2387744) | Cod sursa (job #52891) | Cod sursa (job #2787745)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
const int noduriMAX = 100001;
class Graf
{
private:
int nrNoduri;
int nrMuchii;
int plecareBFS;
bool vizitat[noduriMAX] = { false };
int distanta[noduriMAX] = { 0 };
vector <vector<int>> adiacenta;
queue <int> coadaBFS;
public:
void GrafNeorientat();
void DFS(int start);
void NumaraCompCnx();
void GrafOrientat();
void BFS();
};
void Graf::GrafNeorientat()
{
ifstream in("dfs.in");
in >> nrNoduri >> nrMuchii;
int start;
int capat;
adiacenta.resize(nrNoduri + 1);
for (int i = 0; i < nrMuchii; ++i)
{
in >> start >> capat;
adiacenta[start].push_back(capat);
adiacenta[capat].push_back(start);
}
in.close();
}
void Graf::DFS(int start)
{
vizitat[start] = true;
for (int vecin : adiacenta[start])
{
if (!vizitat[vecin])
DFS(vecin);
}
}
void Graf::NumaraCompCnx()
{
ofstream out("dfs.out");
int nrCompCnx = 0;
for (int i = 1; i <= nrNoduri; ++i)
{
if (!vizitat[i])
{
DFS(i);
nrCompCnx++;
}
}
out << nrCompCnx;
out.close();
}
void Graf::GrafOrientat()
{
ifstream in("bfs.in");
in >> nrNoduri >> nrMuchii >> plecareBFS;
int start;
int capat;
adiacenta.resize(nrNoduri + 1);
for (int i = 0; i < nrMuchii; ++i)
{
in >> start >> capat;
adiacenta[start].push_back(capat);
}
in.close();
}
void Graf::BFS()
{
ofstream out("bfs.out");
vizitat[plecareBFS] = true;
coadaBFS.push(plecareBFS);
while (!coadaBFS.empty())
{
plecareBFS = coadaBFS.front();
coadaBFS.pop();
for (int vecin : adiacenta[plecareBFS])
if (!vizitat[vecin])
{
vizitat[vecin] = true;
distanta[vecin] = distanta[plecareBFS] + 1;
coadaBFS.push(vecin);
}
}
for (int i = 1; i <= nrNoduri; ++i)
{
if (!vizitat[i])
out << -1 << " ";
else
out << distanta[i] << " ";
}
out.close();
}
int main()
{
Graf g;
//g.GrafNeorientat();
//g.NumaraCompCnx();
g.GrafOrientat();
g.BFS();
return 0;
}