Pagini recente » Cod sursa (job #1128387) | Cod sursa (job #742875) | Cod sursa (job #994973) | Cod sursa (job #437512) | Cod sursa (job #1172941)
#include <fstream>
#include <vector>
#include <stack>
using namespace std;
vector<int> L[100005],sol[100005];
stack<int> s;
int vizitat,n,m,i,j,ctc,x,y;
int viz[100005],low[100005];
void DFS( int nod ) {
viz[nod]=++vizitat;
low[nod]=vizitat;
s.push(nod);
vector<int>::iterator it;
for(it=L[nod].begin();it!=L[nod].end();it++) {
if(viz[*it]==0)
DFS(*it);
if(viz[*it]>0)
low[nod]=min(low[nod],low[*it]);
}
if(low[nod]==viz[nod]) {
ctc++;
sol[ctc].push_back(0);
while(s.top()!=nod) {
sol[ctc].push_back(s.top());
++sol[ctc][0];
s.pop();
}
sol[ctc][++sol[ctc][0]]=s.top();
s.pop();
}
}
int main() {
ifstream f("ctc.in");
ofstream g("ctc.out");
f>>n>>m;
for(i=1;i<=m;i++) {
f>>x>>y;
L[x].push_back(y);
}
for(i=1;i<=n;i++)
if(viz[i]==0)
DFS(i);
g<<ctc<<"\n";
for(i=1;i<=ctc;i++) {
for(j=1;j<=sol[i][0];j++)
g<<sol[i][j]<<" ";
g<<"\n";
}
return 0;
}