Pagini recente » Cod sursa (job #2241958) | Cod sursa (job #3170119) | Cod sursa (job #1063369) | Cod sursa (job #1937116) | Cod sursa (job #2978783)
#include <fstream>
using namespace std;
ifstream fin("ctc.in");
ofstream fout("ctc.out");
int n, m, a[2][200005], atr[2][200005], pluss[100005], minuss[100005], start[100005], starttr[100005], viz[100005], nr, v[100005];
void initp();
void initm();
void dfp(int nod);
void dfm(int nod);
void plusminus(int caz);
int main()
{
int i, x, y, k = 0, k1 = 0;
fin >> n >> m;
for (i = 1; i <= m; i++) {
fin >> x >> y;
k++;
a[0][k] = y;
a[1][k] = start[x];
start[x] = k;
k1++;
atr[0][k1] = x;
atr[1][k1] = starttr[y];
starttr[y] = k1;
}
plusminus(1);
fout << nr << "\n";
for (i = 1; i <= n; i++)
v[i] = 0;
plusminus(2);
return 0;
}
void initp()
{
for (int i = 1; i <= n; i++)
viz[i] = pluss[i] = 0;
}
void initm()
{
for (int i = 1; i <= n; i++)
viz[i] = minuss[i] = 0;
}
void dfp(int nod)
{
int x;
pluss[nod] = 1;
viz[nod] = 1;
x = start[nod];
while (x) {
if (viz[a[0][x]] == 0)
dfp(a[0][x]);
x = a[1][x];
}
}
void dfm(int nod)
{
int x;
minuss[nod] = 1;
viz[nod] = 1;
x = starttr[nod];
while (x) {
if (viz[atr[0][x]] == 0)
dfm(atr[0][x]);
x = atr[1][x];
}
}
void plusminus(int caz)
{
int i, j;
for (i = 1; i <= n; i++)
if (v[i] == 0) {
v[i] = 1;
nr++;
initp();
dfp(i);
initm();
dfm(i);
for (j = 1; j <= n; j++)
if (pluss[j] == minuss[j]) {
v[j] = nr;
if (caz == 2)
fout << j << " ";
}
if (caz == 2)
fout << "\n";
}
}