Pagini recente » Cod sursa (job #834172) | Cod sursa (job #254975) | Cod sursa (job #562171) | Cod sursa (job #370398) | Cod sursa (job #2790858)
#include <fstream>
#include <vector>
#include <queue>
#define maxi 100001
using namespace std;
ifstream fin("ctc.in");
ofstream fout("ctc.out");
class Graf
{
int nrNoduri, nrMuchii;
int x, y; // extremitate muchie stanga respectiv dreapta
int vizitat[maxi] = {0};
int pred[maxi]= {0};
int v[maxi]= {0};
int succ[maxi]= {0};
vector<int> *adiacenta; // lista de vecini
vector<int> *adiacenta2; // lista de vecini
queue<int> coada;
int nc=1,d=0;
public:
Graf();
void citireBFS(int &nodPlecare);
void citireTARECONEXE();
void DF1(int nodPlecare);
void DF2(int nodPlecare);
void afisarecomptareconexe();
void BFS();
void afisareCoadaBFS();
void citireDFS();
void DFS(int nodPlecare);
void nrComponenteConexe();
~Graf();
};
// citire graf orientat
void Graf::citireBFS(int &nodPlecare)
{
fin >> nrNoduri >> nrMuchii >> nodPlecare;
for (int i = 1; i <= nrMuchii; i++)
{
fin >> x >> y;
adiacenta[x].push_back(y);
}
for (int i = 1; i <= maxi; i++)
vizitat[i] = -1;
coada.push(nodPlecare);
vizitat[coada.back()] = 1;
}
void Graf::citireTARECONEXE()
{
fin >> nrNoduri >> nrMuchii;
for (int i = 1; i <= nrMuchii; i++)
{
fin >> x >> y;
adiacenta[x].push_back(y);
adiacenta2[y].push_back(x);
}
}
void Graf::BFS()
{
if (!coada.empty()) // daca mai sunt elemente in coada / nu am verificat pt toate nodurile
{
int nodPlecare = coada.front(); // retin nodul de unde plec
for (int j = 0; j < adiacenta[nodPlecare].size(); j++)
if (vizitat[adiacenta[nodPlecare][j]] == -1)
{
// caut toate nodurile nevizitate care sunt adiacente cu nodul de plecare
vizitat[adiacenta[nodPlecare][j]] = vizitat[nodPlecare] + 1; // il marcam vizitat
coada.push(adiacenta[nodPlecare][j]); // il adaug in coada PUSH
}
coada.pop();
BFS();
}
}
void Graf::afisareCoadaBFS()
{
for (int i = 1; i <= nrNoduri; i++)
{
if (vizitat[i] == -1)
fout << -1 << " ";
else
fout << vizitat[i] - 1 << " ";
}
}
// citire graf neorientat
void Graf::citireDFS()
{
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::DFS(int nodPlecare)
{
vizitat[nodPlecare] = 1;
for (int i = 0; i < adiacenta[nodPlecare].size(); i++)
if (!vizitat[adiacenta[nodPlecare][i]])
DFS(adiacenta[nodPlecare][i]);
}
void Graf::DF1(int nodPlecare)
{
succ[nodPlecare] = 1;
for (int i = 0; i < adiacenta[nodPlecare].size(); i++)
if (!succ[adiacenta[nodPlecare][i]])
DF1(adiacenta[nodPlecare][i]);
v[++d]=nodPlecare;
}
void Graf::DF2(int nodPlecare)
{
pred[nodPlecare] = nc;
for (int i = 0; i < adiacenta2[nodPlecare].size(); i++)
if (!pred[adiacenta2[nodPlecare][i]])
DF2(adiacenta2[nodPlecare][i]);
}
void Graf::afisarecomptareconexe()
{
for(int i=1; i<=nrNoduri; i++)
if(succ[i]==0)
DF1(i);
for(int i=nrNoduri; i>=1; i--)
if(pred[v[i]]==0)
{
DF2(v[i]);
nc++;
}
fout<<nc-1<<'\n';
for(int i=1; i<nc; i++)
{
for(int j=1; j<=nrNoduri; j++)
if(pred[j]==i) fout<<j<<' ';
fout<<'\n';
}
}
void Graf::nrComponenteConexe()
{
int nr = 0;
for (int i = 1; i <= nrNoduri; i++)
if (vizitat[i] == 0)
{
nr++;
DFS(i);
}
fout << nr;
}
int main()
{
/*
// Problema BFS
int nodPlecare;
Graf g1;
g1.citireBFS(nodPlecare);
g1.BFS();
g1.afisareCoadaBFS();
*/
/*
// Problema DFS
Graf g1;
g1.citireDFS();
g1.nrComponenteConexe();
*/
Graf g1;
g1.citireTARECONEXE();
g1.afisarecomptareconexe();
fin.close();
fout.close();
return 0;
}
Graf::Graf()
{
nrNoduri = nrMuchii = x = y = 0;
adiacenta = new vector<int>[maxi];
adiacenta2 = new vector<int>[maxi];
}
Graf::~Graf()
{
delete[] adiacenta;
delete[] adiacenta2;
}