Pagini recente » Cod sursa (job #2047495) | Cod sursa (job #1330830) | Cod sursa (job #1738466) | Cod sursa (job #2895990) | Cod sursa (job #359081)
Cod sursa(job #359081)
//Algoritm de depistare a componentelor tare-conexe
// complexitate O(n+m)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
int nodes;
vector<vector<int > > g;
vector<vector<int > > gt;
void read(const char * buff_file)
{
fstream f(buff_file, ios::in);
if (f==NULL)
{
cerr<<"EROARE!";
exit(0);
}
else
{
int edges,left,right;
f>>nodes;
f>>edges;
g.reserve(nodes+1);
g.resize(nodes+1);
gt.reserve(nodes+1);
gt.resize(nodes+1);
for (int i=1; i<=edges; ++i)
{
f>>left>>right;
g[left].push_back(right);
gt[right].push_back(left);
}
f.close();
}
};
int *parcurgere;
int nr_parcurgere;
int *used;
void DFS(int i) //parcurg DFS graful
{
for (vector<int >::iterator it=g[i].begin(); it < g[i].end(); it++)
{
if (!used[*it])
{
used[*it]=1;
DFS(*it);
parcurgere[++nr_parcurgere]=*it;
}
}
}
void set0(int *&temp, int nr_temp=nodes)
{
for (int i=1; i<=nr_temp; ++i)
temp[i]=0;
}
void print(int *&temp, int nr_temp=nodes)
{
for (int i=1; i<=nr_temp; ++i)
cout<<temp[i]<<" ";
cout<<"\n";
};
vector<vector<int > > out;
int nr_out;
void DFSt(int i, vector<vector<int > > &out) //parcurg DFS graful transpus
{
for (vector<int>::iterator it=gt[i].begin(); it < gt[i].end(); it++)
{
if (!used[*it])
{
used[*it]=1;
//cout<<*it<<" ";
out[nr_out].push_back(*it);
DFSt(*it, out);
}
}
};
void TareConex()
{
out.reserve(nodes+1);
out.resize(nodes+1);
parcurgere=new int[nodes+2];
set0(parcurgere);
used=new int[nodes+1];
set0(used);
for (int i=1; i<=nodes; ++i)
{
if (!used[i])
{
used[i]=1;
DFS(i);
parcurgere[++nr_parcurgere]=i;
}
}
set0(used);
for (int i=nr_parcurgere; i>=1; --i)
{
if (!used[parcurgere[i]])
{
++nr_out;
out[nr_out].push_back(parcurgere[i]);
//cout<<parcurgere[i]<<" ";
used[parcurgere[i]]=1;
DFSt(parcurgere[i],out);
}
}
}
void print(const char * out_file)
{
fstream g(out_file, ios::out);
g<<nr_out<<"\n";
for (int i=1; i<=nr_out; ++i)
{
for (vector<int>::iterator it=out[i].begin(); it < out[i].end(); it++)
g<<*it<<" ";
g<<"\n";
}
}
int main()
{
read("ctc.in");
TareConex();
print("ctc.out");
return 0;
}