Pagini recente » Cod sursa (job #1568154) | Cod sursa (job #2171929) | Cod sursa (job #2049686) | Cod sursa (job #534084) | Cod sursa (job #1430409)
#include <iostream>
#include <fstream>
#include <stack>
#include <vector>
using namespace std;
int n,*v;
stack<int> s;
vector<int> *m;
vector<int> *m1;
void dfs(int x,int w) {
v[x] = 1;
int i;
if (!w) {
for (i=0;(unsigned)i<m[x].size();i++) {
if (!v[m[x][i]]) {
dfs(m[x][i],w);
}
}
}
else
for (i=0;(unsigned)i<m1[x].size();i++) {
if (!v[m1[x][i]]) {
dfs(m1[x][i],w);
}
}
s.push(x);
}
int main()
{
int i,j,x,y,c = 0;
ifstream f("ctc.in");
f>>n>>i;
v = new int[n+1];
for (i=1;i<=n;i++) v[i] = 0;
m = new vector<int>[n+1];
while (f>>x>>y) m[x].push_back(y);
f.close();
for (i=1;i<=n;i++)
if (!v[i]) dfs(i,0);
m1 = new vector<int>[n+1];
for (i=1;i<=n;i++)
for (j=0;(unsigned)j<m[i].size();j++)
m1[m[i][j]].push_back(i);
stack<int> s1 = stack<int>(s);
stack<int> s2 = stack<int>(s);
stack<int> *p;
ofstream g("ctc.out");
int sw = 0;
while (sw < 2) {
for (i=1;i<=n;i++) v[i] = 0;
if (!sw) p = &s1;
else p = &s2;
while (!p->empty()) {
while (!s.empty()) s.pop();
x = p->top();
p->pop();
if (v[x]) continue;
dfs(x,1);
if (sw) {
while (!s.empty()) {
g<<s.top()<<" ";
s.pop();
}
g<<endl;
}
else c++;
}
sw++;
if (sw == 1) g<<c<<endl;
}
g.close();
return 0;
}