Pagini recente » Cod sursa (job #1596751) | Cod sursa (job #1539140)
#include <cstdio>
#include <algorithm>
using std::min;
const int MAX_N = 1e5;
const int MAX_M = 2e5;
const int NIL = -1;
struct cell {
int v, next;
};
cell l[MAX_M];
int adj[MAX_N];
int indx[MAX_N];
int nextIndex;
int st[MAX_N], ss;
bool onStack[MAX_N];
int scc[MAX_N];
int numScc;
int dfs(int u) {
int v, minPtr;
indx[u] = minPtr = nextIndex++;
st[ss++] = u;
onStack[u] = true;
for (int i = adj[u]; i != NIL; i = l[i].next) {
v = l[i].v;
if (indx[v] == NIL) {
minPtr = min(minPtr, dfs(v));
} else if (onStack[v]) {
minPtr = min(minPtr, indx[v]);
}
}
if (minPtr == indx[u]) {
do {
v = st[--ss];
onStack[v] = false;
scc[v] = numScc;
} while (u != v);
numScc++;
}
return minPtr;
}
void addEdge(int u, int v, int pos) {
l[pos].v = v;
l[pos].next = adj[u];
adj[u] = pos;
}
int main(void) {
freopen("ctc.in", "r", stdin);
freopen("ctc.out", "w", stdout);
int N, M;
scanf("%d%d", &N, &M);
for (int i = 0; i < N; i++) {
adj[i] = indx[i] = NIL;
}
for (int i = 0; i < M; i++) {
int u, v;
scanf("%d%d", &u, &v);
addEdge(u - 1, v - 1, i);
}
fclose(stdin);
for (int i = 0; i < N; i++) {
if (indx[i] == NIL) {
dfs(i);
}
}
printf("%d\n", numScc);
for (int i = 0; i < numScc; i++) {
for (int j = 0; j < N; j++) {
if (scc[j] == i) {
printf("%d ", 1 + j);
}
}
putchar('\n');
}
fclose(stdout);
return 0;
}