Pagini recente » Cod sursa (job #3042124) | Cod sursa (job #2486578) | Cod sursa (job #2876009) | Cod sursa (job #3155839) | Cod sursa (job #767150)
Cod sursa(job #767150)
#include<stdlib.h>
#include<stdio.h>
struct node{
int value;
struct node *next;
} *G[100001], *Gt[100001], *r[100001];
int N, nrComp, visited[100001], stack[100001];
FILE *in, *out;
void df1(int i)
{
struct node *p;
visited[i] = 1;
for(p = G[i]; p; p = p->next)
if(!visited[p->value])
df1(p->value);
stack[++stack[0]] = i;
}
void df2(int i)
{
struct node *p, *t;
visited[i] = 0;
t = malloc(sizeof(struct node));
t->value = i;
t->next = r[nrComp];
r[nrComp] = t;
for(p = Gt[i]; p; p = p->next)
if(visited[p->value])
df2(p->value);
}
int main(){
int i, M, a, b;
struct node *p;
in = fopen("ctc.in", "r");
out = fopen("ctc.out", "w");
fscanf(in, "%d %d", &N, &M);
for(; M; --M){
fscanf(in, "%d %d", &a, &b);
p = malloc(sizeof(struct node));
p->value = b;
p->next = G[a];
G[a] = p;
p = malloc(sizeof(struct node));
p->value = a;
p->next = Gt[b];
Gt[b] = p;
}
for(i = 1; i <= N; ++i)
if(!visited[i]){
df1(i);
}
for(nrComp = 0, i = N; i; --i)
if(visited[stack[i]]){
++nrComp;
df2(stack[i]);
}
fprintf(out, "%d\n", nrComp);
for(i = 1; i <= nrComp; ++i)
{
for(p = r[i]; p; p = p->next)
fprintf(out, "%d ", p->value);
fprintf(out, "\n");
}
fclose(in);
fclose(out);
return 0;
}