Pagini recente » Cod sursa (job #713453) | Cod sursa (job #488990) | Cod sursa (job #2551949) | Cod sursa (job #711845) | Cod sursa (job #2209396)
#include <stdio.h>
#define NMAX 100000
#define MMAX 200000
static struct edge {
int vertex;
int next;
} edges[2*MMAX+1];
static int adj[NMAX+1], adj_t[NMAX+1], done[2*NMAX+1], output[2*NMAX+1], t, nout;
static char visited[NMAX+1];
static void dfs(int s, char is_first_dfs)
{
int e;
visited[s] = is_first_dfs;
for (e = is_first_dfs ? adj[s] : adj_t[s]; e != 0; e = edges[e].next) {
if (visited[edges[e].vertex] != is_first_dfs) {
dfs(edges[e].vertex, is_first_dfs);
}
}
if (is_first_dfs) {
done[t++] = s;
} else {
output[++nout] = s;
}
}
int main(void)
{
int i, n, m, u, v;
freopen("ctc.in", "r", stdin);
freopen("ctc.out", "w", stdout);
scanf("%d %d", &n, &m);
for (i = 1; i <= m; i++) {
scanf("%d %d", &u, &v);
edges[2*i].vertex = v;
edges[2*i].next = adj[u];
adj[u] = 2*i;
edges[2*i+1].vertex = u;
edges[2*i+1].next = adj_t[v];
adj_t[v] = 2*i+1;
}
for (i = 1; i <= n; i++) {
if (visited[i] == 0) {
dfs(i, 1);
}
}
while (t--) {
if (visited[done[t]] == 1) {
dfs(done[t], 0);
output[++nout] = -1;
output[0]++;
}
}
printf("%d\n", output[0]);
for (m = i = 0; i < output[0]; i++) {
while (output[++m] != -1) {
printf("%d ", output[m]);
}
printf("\n");
}
return 0;
}