Pagini recente » Cod sursa (job #1350821) | Cod sursa (job #443785) | Cod sursa (job #3243230) | Cod sursa (job #856241) | Cod sursa (job #1430407)
#include <iostream>
#include <fstream>
#include <stack>
#include <vector>
using namespace std;
int n,*v;
stack<int> s;
vector<int> *m;
void dfs(int x) {
v[x] = 1;
int i;
for (i=0;(unsigned)i<m[x].size();i++) {
if (!v[m[x][i]]) {
dfs(m[x][i]);
}
}
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);
vector<int> m1[n+1];
for (i=1;i<=n;i++)
for (j=0;(unsigned)j<m[i].size();j++)
m1[m[i][j]].push_back(i);
for (i=1;i<=n;i++) m[i].clear();
for (i=1;i<=n;i++)
for (j=0;(unsigned)j<m1[i].size();j++)
m[i].push_back(m1[i][j]);
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);
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;
}