Pagini recente » Cod sursa (job #1632106) | Cod sursa (job #1786900) | Cod sursa (job #2344986) | Cod sursa (job #1561751) | Cod sursa (job #1106411)
#include <fstream>
#include <vector>
#include <list>
using namespace std;
vector<pair<int,int> > graf[100005];
//pair <int,int> f[100005]; // first=timp terminare, second=nr. nod
int n,m,c;
bool check[100005]={0};
list <int> f; //finish times
vector <int> comp[100005];
void read(bool mode) // mode 1: read the graph; mode 0: read the transposed graph;
{
ifstream d("ctc.in");
d>>n>>m;
for (int i=1;i<=m;i++)
{
int x,y;
d>>x>>y;
if (mode) graf[x].push_back(make_pair(x,y));
else graf[y].push_back(make_pair(y,x));
}
}
void dfs(int nod)
{
vector <pair<int,int> >::iterator it;
check[nod]=1;
for (it=graf[nod].begin(); it!=graf[nod].end(); it++)
{
if (!check[(*it).second]) dfs((*it).second);
}
f.push_front(nod);
}
void standardDfss()
{
for (int i=1;i<=n;i++)
{
if (!check[i])
{
dfs(i);
}
}
}
void resetGraf()
{
for (int i=1;i<=n;i++) graf[i].clear();
for (int i=1;i<=n;i++) check[i]=0;
}
void dfs2(int nod, int k)
{
vector <pair<int,int> >::iterator it;
check[nod]=1;
for (it=graf[nod].begin(); it!=graf[nod].end(); it++)
{
if (!check[(*it).second]) dfs2((*it).second,k);
}
comp[k].push_back(nod);
}
void transposedDfss()
{
list<int>::iterator il;
int k=1;
for (il=f.begin();il!=f.end();il++)
{
if (!check[*il])
{
dfs2(*il,k);
k++;
}
}
c=k-1;
}
void write()
{
ofstream o("ctc.out");
o<<c<<'\n';
for (int i=1;i<=c;i++)
{
vector<int> ::iterator it;
for (it=comp[i].begin(); it!=comp[i].end(); ++it) o<<(*it)<<' ';
o<<'\n';
}
}
int main()
{
read(1);
standardDfss();
resetGraf();
read(0);
transposedDfss();
write();
}