Pagini recente » Cod sursa (job #1092126) | Cod sursa (job #3290703) | Cod sursa (job #32003) | Cod sursa (job #1355759) | Cod sursa (job #2787095)
#include <bits/stdc++.h>
const int maxi=100001;
using namespace std;
ifstream fin("dfs.in");
ofstream fout("dfs.out");
class Graf
{
int nrNoduri, nrMuchii;
int vizitat2[100001], coada[100001];
int pozitiePlecare, pozitieUltima;
vector<int> adiacenta[maxi];
// int **matriceAdiacenta;
public:
Graf();
void BFS(int nodPlecare);
void DFS(int nodPlecare);
void citire2(int &nodPlecare);
void BFS2(int nodPlecare);
void afisareCoada2();
void citire();
void afisare();
void afisareCoada();
void nrcomponenteconexe();
~Graf();
};
// neorientat
Graf::Graf()
{
// matriceAdiacenta = new int *[nrNoduri]; /// tabloul pointerilor de linii
// for (int i = 0; i < nrNoduri; i++)
// matriceAdiacenta[i] = new int[nrNoduri]; /// tabloul valorilor din linie
for (int i = 1; i <= maxi; i++)
vizitat2[i] = 0;
pozitiePlecare = pozitieUltima = 1;
// coada[1] = 2;
// vizitat[2] = 1;
}
Graf::~Graf()
{
// for (int i = 0; i < nrNoduri; i++)
// delete[] matriceAdiacenta[i];
// delete[] matriceAdiacenta;
}
void Graf::citire()
{
int x, y;
fin >> nrNoduri >> nrMuchii;
for (int i = 1; i <= nrMuchii; i++)
{
fin >> x >> y;
adiacenta[x].push_back(y);
adiacenta[y].push_back(x);
}
}
void Graf::citire2(int &nodPlecare)
{
int x, y;
fin >> nrNoduri >> nrMuchii >> nodPlecare;
for (int i = 1; i <= nrMuchii; i++)
{
fin >> x >> y;
adiacenta[x].push_back(y);
//adiacenta[y].push_back(x);
}
coada[1] = nodPlecare;
vizitat2[coada[1]] = 1;
}
void Graf::BFS2(int pozitiePlecare)
{
int nodPlecare = coada[pozitiePlecare]; // retin nodul de unde plec
for (int j = 0; j < adiacenta[nodPlecare].size(); j++)
if (vizitat2[adiacenta[nodPlecare][j]] == -1)
{
// caut toate nodurile nevizitate care sunt adiacente cu nodul de plecare
vizitat2[adiacenta[nodPlecare][j]] = vizitat2[nodPlecare] + 1; // il marcam vizitat
pozitieUltima++; // indexez pozitia ultimului element din coada
coada[pozitieUltima] = adiacenta[nodPlecare][j]; // il adaug in coada PUSH
}
if (pozitiePlecare < pozitieUltima) // daca mai sunt elemente in coada / nu am verificat pt toate nodurile
BFS2(pozitiePlecare + 1);
}
void Graf::afisareCoada2()
{
for (int i = 1; i <= nrNoduri; i++)
{
if (vizitat2[i] != -1)
fout << vizitat2[i] - 1 << " ";
else
fout << -1 << " ";
}
}
/*virtual void dfs(int node) override{
vis[node] = true;
for(unsigned i = 0; i < adj[node].size(); ++i)
if(!(vis[adj[node][i]]))
dfs(adj[node][i]);
*/
void Graf::DFS(int nodPlecare)
{
vizitat2[nodPlecare]=1;
//fout<<nodPlecare<<" ";
for(int i = 0; i < adiacenta[nodPlecare].size(); ++i)
if(!(vizitat2[adiacenta[nodPlecare][i]]))
DFS(adiacenta[nodPlecare][i]);
}
void Graf::nrcomponenteconexe()
{
int nr=0;
for(int i=1;i<=nrNoduri;i++)
if(vizitat2[i]==0)
{
nr++;
DFS(i);
}
fout<<nr;
}
int main()
{
int nodPlecare;
Graf g1;
g1.citire();
g1.nrcomponenteconexe();
return 0;
}