Pagini recente » Cod sursa (job #2073334) | Cod sursa (job #1898844) | Cod sursa (job #1332287) | Cod sursa (job #1469737) | Cod sursa (job #1731953)
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
#define nmax 100005
using namespace std;
int n, m, x, y, idx, ctc;
vector <int> vecin[nmax], sol[nmax];
stack <int> s;
typedef struct {
int index, lowlink;
bool in_stack;
}node;
node v[nmax];
void read()
{
ifstream fin("ctc.in");
fin >> n >> m;
for(int i = 1; i <= m; ++i){
fin >> x >> y;
vecin[x].push_back(y);
}
}
void tarjan(int x)
{
v[x].index = ++idx;
v[x].lowlink = idx;
s.push(x);
v[x].in_stack = true;
for(int i = 0; i < vecin[x].size(); ++i)
if(v[vecin[x][i]].index == 0){
tarjan(vecin[x][i]);
v[x].lowlink = min(v[x].lowlink, v[vecin[x][i]].lowlink);
}
else if(v[vecin[x][i]].in_stack)
v[x].lowlink = min(v[x].lowlink, v[vecin[x][i]].index);
if(v[x].index == v[x].lowlink){
ctc++;
do{
y = s.top();
s.pop();
v[y].in_stack = false;
sol[ctc].push_back(y);
} while(y != x);
}
}
void write()
{
ofstream fout("ctc.out");
fout << ctc;
for(int i = 1; i <= ctc; ++i){
fout << '\n';
for(int j = 0; j < sol[i].size(); ++j)
fout << sol[i][j] << ' ';
}
}
int main()
{
read();
for(int i = 1; i <= n; ++i)
if(v[i].index == 0)
tarjan(i);
write();
return 0;
}