Pagini recente » Cod sursa (job #1352711) | Cod sursa (job #2104317) | Cod sursa (job #2530434) | Cod sursa (job #580158) | Cod sursa (job #3142694)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("retele.in");
ofstream fout("retele.out");
int n, m, i, j, x, y, g[100002];
bool a[100002][100002];
queue<int> q[100002];
bitset<100002> fr1, fr2;
static inline void parc1(int x) {
fr1[x] = 1;
for(int i = 1; i <= n; i++) {
if(a[x][i] && !fr1[i]) parc1(i);
}
}
static inline void parc2(int x) {
fr2[x] = 1;
for(int i = 1; i <= n; i++) {
if(a[i][x] && !fr2[i]) parc2(i);
}
}
int main() {
fin >> n >> m;
for(i = 1; i <= m; i++) {
fin >> x >> y;
a[x][y] = true;
}
x = 0;
for(i = 1; i <= n; i++) {
if(!g[i]) {
fr1 = fr2 = 0;
parc1(i);
parc2(i);
x++;
for(j = 1; j <= n; j++) {
if(fr1[j] && fr2[j]) g[j] = x;
}
}
}
fout << x << "\n";
for(i = 1; i <= n; i++) q[g[i]].push(i);
for(i = 1; i <= x; i++) {
fout << q[i].size() << " ";
while(!q[i].empty()) {
fout << q[i].front() << " ";
q[i].pop();
}
fout << "\n";
}
return 0;
}