Pagini recente » Cod sursa (job #1809708) | Cod sursa (job #1531596) | Cod sursa (job #1098072) | Cod sursa (job #1009126) | Cod sursa (job #2785041)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
//std::ifstream f("graful.txt");
//std::ofstream g("graful.out");
std::ifstream f("dfs.in");
std::ofstream g("dfs.out");
int start = 0;
class graf
{
int nrvf, nrmuchii;
std::vector<int>* vecini;
public:
graf(bool orientat);
void verifvecini();
void BFS();
void DFS(int nod, bool* viz);
void cadruDFS();
~graf()
{
delete []vecini;
}
};
graf::graf(bool orientat)
{
f >> nrvf >> nrmuchii;
if(start == 1) // daca avem de citit un nod de start...
f >> start;
vecini = new std::vector<int>[nrvf + 1];
if (orientat == true)
for (int i = 0; i < nrmuchii; i++)
{
int x, y;
f >> x >> y;
vecini[x].push_back(y);
}
else
for (int i = 0; i < nrmuchii; i++)
{
int x, y;
f >> x >> y;
vecini[x].push_back(y);
vecini[y].push_back(x);
}
}
void graf::verifvecini()
{
for (int i = 1; i <= nrvf; i++)
{
std::cout << "\n vecinii lui " << i << " : ";
for (unsigned int j = 0; j < vecini[i].size(); j++)
std::cout << vecini[i][j] << " ";
}
}
void graf::BFS()
{
int* dist = new int[nrvf + 1]{ 0 }; // initializam distantele cu 0 (le decrementam ulterior)
std::queue <int> qBFS; // coada pt BFS
qBFS.push(start);
dist[start] = 1;
while (!qBFS.empty())
{
const int nod = qBFS.front();
for (unsigned int i = 0; i < vecini[nod].size(); i++)
{
const int nod_urm = vecini[nod][i];
if (dist[nod_urm] == 0)
{
qBFS.push(nod_urm);
dist[nod_urm] = dist[nod] + 1;
}
}
qBFS.pop();
}
for (int i = 1; i <= nrvf; i++)
g << dist[i] - 1 << " ";
delete [] dist;
}
void graf::DFS(int nod, bool* viz)
{
viz[nod] = true;
for (int i = 0; i < vecini[nod].size(); i++)
{
const int nod_urm = vecini[nod][i];
if (!viz[nod_urm])
DFS(nod_urm, viz);
}
}
void graf::cadruDFS()
{
int conexe = 0;
bool* viz = new bool[nrvf + 1]{ 0 };
for (int i = 1; i <= nrvf; i++)
if( ! viz[i] )
{
conexe++;
DFS(i, viz);
}
g << conexe;
}
int main()
{
start = 1; // afirmam ca citim si un nod de start;
graf g(false);
g.cadruDFS();
return 0;
}