Pagini recente » Cod sursa (job #786097) | Cod sursa (job #1243949) | Cod sursa (job #2460032) | Profil Azakaru | Cod sursa (job #2928542)
#include <fstream>
#include <iostream>
#include <vector>
#define MAXN 100000
using namespace std;
int x;
int marked[MAXN];
vector<vector<int>> v, u, r;
static inline bool isTaken(int x) {
if (marked[x] % 2 != 0 || marked[x] == 0)
return false;
return true;
}
void floodfill(int id) {
if (marked[id] != x + 1 && !isTaken(id)) {
marked[id] = x + 1;
int i;
for (i = 0; i < v[id].size(); i++) {
floodfill(v[id][i]);
}
}
}
void reverseflood(int id) {
if (marked[id] == x + 1) {
marked[id] = x + 2;
int i;
for (i = 0; i < u[id].size(); i++) {
reverseflood(u[id][i]);
}
}
}
int main() {
int n, m, i, a, b, j, nr;
ifstream fin("ctc.in");
fin >> n >> m;
v.resize(n);
u.resize(n);
for (i = 0; i < m; i++) {
fin >> a >> b;
a--;
b--;
v[a].push_back(b);
u[b].push_back(a);
}
fin.close();
// for (i = 0; i < v.size(); i++) {
// cout << i + 1 << ": ";
// for (j = 0; j < v[i].size(); j++)
// cout << v[i][j] + 1 << " ";
// cout << endl;
// }
x = 0;
for (i = 0; i < n; i++) {
floodfill(i);
reverseflood(i);
x += 2;
}
nr = 0;
r.resize(x + 1);
for (i = 0; i < n; i++) {
// printf("%d: %d\n", i, marked[i]);
if (r[marked[i]].size() == 0)
nr++;
r[marked[i]].push_back(i);
}
ofstream fout("ctc.out");
fout << nr << endl;
for (i = 0; i < x; i++) {
if (r[i].size() != 0) {
for (j = 0; j < r[i].size(); j++) {
fout << r[i][j] + 1 << " ";
}
fout << endl;
}
}
fout << endl;
fout.close();
return 0;
}