Pagini recente » Cod sursa (job #220782) | Cod sursa (job #914758) | Cod sursa (job #2557962) | Cod sursa (job #79670) | Cod sursa (job #2928270)
////complexitate O(V+E)
#include <iostream>
#include <fstream>
#include <stack>
#include<vector>
using namespace std;
ifstream f("ctc.in");
ofstream g("ctc.out");
vector<vector<int>> componente;
vector<vector<int>> listaAd;
vector<vector<int>> listaAdTr;
vector<bool>vizitat;
stack<int> stiva;
int noduri,muchii,x,y,i,j,nod;
void creareListaAdiacenta()
{
for(int i=0;i<muchii;i++)
{
f>>x>>y;
listaAd[x].push_back(y);
}
}
//void afisareListaAdiacenta()
//{
// for(int x=1; x<=noduri;x++)
// {
// cout<<x<<": ";
// for(auto y:listaAd[x])
// cout<<y<<" , ";
// cout<<endl;
// }
//}
void DFS(int nod)
{
vizitat[nod]=1;
auto vecini=listaAd[nod];
for(auto x:vecini)
if(!vizitat[x])
DFS(x);
stiva.push(nod);
}
////graf inversat (graf in care directiile arcelor sunt inversate)
void transp()
{
for(i=1;i<=noduri;i++)
for(auto nod:listaAd[i])
listaAdTr[nod].push_back(i);
for(i=1;i<=noduri;i++)
vizitat[i]=0;
}
////creeaza vectorul de vectori cu diferitele comp tari conexe
void compConexe(int nod,int j)
{
vizitat[nod]=1;
componente[j].push_back(nod);
auto vecini=listaAdTr[nod];
for(auto x:vecini)
if(!vizitat[x])
compConexe(x,j);
}
int main()
{
f>>noduri;
f>>muchii;
listaAd.resize(noduri+1);
listaAdTr.resize(noduri+1);
vizitat.resize(noduri+1);
creareListaAdiacenta();
for(nod=1;nod<=noduri;nod++)
if(!vizitat[nod])
DFS(nod);////punem nodurile in stiva prin DFS
transp(); //// listaAdTr=lista de adiacenta a
//// grafului inversat+reinitializarea vectorului "vizitat" cu 0
componente.resize(noduri+1);
while(!stiva.empty())
{
nod=stiva.top();
stiva.pop();
////vector de vectori care contine
//// componentele tare conex
if(!vizitat[nod])
{ j++;
compConexe(nod,j);
}
}
g<<j<<"\n";
for(i=1;i<=j;i++)
{
for(auto x:componente[i])
g<<x<<" ";
g<<"\n";
}
f.close();
g.close();
return 0;
}