Pagini recente » Cod sursa (job #2033468) | Cod sursa (job #759819) | Cod sursa (job #1346133) | Cod sursa (job #2328728) | Cod sursa (job #856827)
Cod sursa(job #856827)
#include <fstream>
#include <iostream>
#include <stack>
#include <vector>
#define minim(a,b) ((a) < (b) ? (a) : (b))
#define NMAX 100010
using namespace std;
ifstream in("ctc.in");
ofstream out("ctc.out");
vector <int> vecini[NMAX];
stack <int> s;
vector <int>sol[NMAX];
int index[NMAX],viz[NMAX],lowlink[NMAX],n,m,nr=0,ind=0;
void citire()
{
in>>n>>m;
for (int i=1;i<=m;i++)
{
int x,y;
in>>x>>y;
vecini[x].push_back(y);
}
}
void tarjan(const int nod,const vector<int>* vecini)
{
int i;
index[nod]=ind;
lowlink[nod]=ind;
ind++;
viz[nod]=1;
s.push(nod);
for(i=0;i<vecini[nod].size();i++)
{
if (index[vecini[nod][i]]== -1)
{
tarjan(vecini[nod][i],vecini);
lowlink[nod]=minim(lowlink[nod],lowlink[vecini[nod][i]]);
}
else
{
if (viz[vecini[nod][i]]==1)
{
lowlink[nod]=minim(lowlink[nod],lowlink[vecini[nod][i]]);
}
}
}
if (lowlink[nod]==index[nod])
{
nr++;
int nod1;
do{
nod1=s.top();
sol[nr].push_back(nod1);
s.pop();
viz[nod1]=0;
}
while (nod1!=nod);
cout<<nr<<'\n';
for (int j=0;j<sol[nr].size();j++)
cout<<sol[nr][i]<<' ';
cout<<'\n';
}
}
void init()
{
for (int i=1;i<=n;i++)
{
viz[i]=0;
index[i]=-1;
lowlink[i]=0;
}
}
int main()
{
citire();
init();
for (int i=1;i<=n;i++)
{
if (index[i]==-1)
{
cout<<i<<' ';
tarjan(i,vecini);
}
}
out<<nr<<'\n';
for (int i=1;i<=nr;i++)
{
for (int j=0;j<sol[i].size();j++)
out<<sol[i][j]<<' ';
out<<'\n';
}
return 0;
}