Pagini recente » Cod sursa (job #406594) | Cod sursa (job #1977871) | Cod sursa (job #721598) | Cod sursa (job #950280) | Cod sursa (job #1926020)
#include <iostream>
#include <fstream>
#include <list>
#include <queue>
#include <stack>
using namespace std;
ifstream f("date.in");
ofstream g("date.out");
class grafuri_orientate
{
unsigned int numar_noduri;
list <int > *lista;
list <int> *revlista;
public:
grafuri_orientate(unsigned int a=0) //Constructorul
{
numar_noduri=a;
lista=new list<int> [a];
revlista=new list <int> [a];
};
friend istream & operator >>( istream& i, grafuri_orientate & A);
bool get_data_graf();
bool parcurgere_in_latime(int nod);
bool parcurgere_in_adancime(int nod);
bool parcurgere(int nod,bool visited[], int noduri[], int &nr);
bool dfs_reverse(int nod, bool *visited, list <int> *&a,int nr);
bool componente_tare_conexe();
};
int main()
{
grafuri_orientate A;
f>>A;
A.componente_tare_conexe();
return 0;
}
std:: istream & operator >>(std:: istream & i, grafuri_orientate & A)
{
unsigned m;
i>>A.numar_noduri;
i>>m;
A.lista=new list <int> [A.numar_noduri+1];
A.revlista=new list <int> [A.numar_noduri+1];
for(unsigned int l=1;l<=m;l++)
{
int x,y;
i>>x>>y;
A.lista[x].push_back(y);
A.revlista[y].push_back(x);
}
return i;
}
bool grafuri_orientate:: parcurgere_in_latime( int nod)
{
queue <int> coada;
bool visited[numar_noduri+1];
for(unsigned int i=0;i<=numar_noduri+1;i++) visited[i]=0;
coada.push(nod);
visited[nod]=1;
while(!coada.empty())
{
int k=coada.front();
g<<k<<" ";
for(list <int>:: iterator it=lista[k].begin();it!=lista[k].end();it++)
if(visited[*it]==0)
{
coada.push(*it);
visited[*it]=1;
}
coada.pop();
}
return 1;
}
bool grafuri_orientate:: parcurgere(int nod,bool visited[],int noduri[], int &nr)
{
visited[nod]=1;
for(list <int> :: iterator it=lista[nod].begin();it!=lista[nod].end();++it)
if(visited[*it]==0)
{
parcurgere(*it,visited,noduri,nr);
}
nr++;
noduri[nr]=nod;
return 1;
}
bool grafuri_orientate:: parcurgere_in_adancime(int nod)
{
bool visited[numar_noduri+1];
int noduri[numar_noduri+1],nr=0;;
for(unsigned int i=1;i<=numar_noduri;i++) visited[i]=0;
for(unsigned int i=1;i<=numar_noduri;++i)
if(visited[i]==0)
{parcurgere(i,visited,noduri,nr);
}
for(unsigned int i=numar_noduri;i>=1;--i)
g<<noduri[i]<<" ";g<<"\n";
return 1;
}
bool grafuri_orientate::get_data_graf()
{
g<<"Graful are: "<<this->numar_noduri<<" noduri\n";
for(unsigned int i=1;i<=this->numar_noduri;i++)
{
for(list <int> ::iterator it=this->lista[i].begin();it!=this->lista[i].end();it++)
g<<*it<<" ";
g<<"\n";
}
g<<"GRAFUL REVERSE:";
for(unsigned int i=1;i<=this->numar_noduri;i++)
{
for(list <int> ::iterator it=this->revlista[i].begin();it!=this->revlista[i].end();it++)
g<<*it<<" ";
g<<"\n";
}
return 1;
}
bool grafuri_orientate::dfs_reverse(int nod, bool *visited, list <int> *&a,int nr)
{
visited[nod]=0;
for(list <int> :: iterator it=revlista[nod].begin();it!=revlista[nod].end();++it)
if(visited[*it]==1)
{
dfs_reverse(*it,visited,a,nr);
}
a[nr].push_back(nod);
return 1;
}
bool grafuri_orientate:: componente_tare_conexe()
{
bool visited[numar_noduri+1];
list <int> *solutii; solutii=new list <int> [numar_noduri+1];
int nur=0; //Numarul solutiilor
for(unsigned int i=1;i<=numar_noduri;++i) visited[i]=0;
int noduri[numar_noduri+1];
int nr=0;
for(unsigned int i=1;i<=numar_noduri;++i)
if(visited[i]==0)
parcurgere(i,visited,noduri,nr);
for(int i=1;i<=numar_noduri;i++)
cout<<noduri[i]<<" ";
for(unsigned int i=numar_noduri;i>=1;--i)
if(visited[noduri[i]]==1)
{
cout<<"DE CE?\n";
nur++;
dfs_reverse(noduri[i],visited,solutii,nur);
}
g<<nur<<"\n";
for(int i=1;i<=nur;++i)
{
for(list <int> :: iterator it=solutii[i].begin();it!=solutii[i].end();++it)
g<<*it<<" ";
g<<"\n";
}
return 1;
}