Pagini recente » Cod sursa (job #529504) | Cod sursa (job #736989) | Cod sursa (job #346385) | Cod sursa (job #2084565) | Cod sursa (job #590873)
Cod sursa(job #590873)
#include<stdio.h>
#include<malloc.h>
typedef struct _nod
{
int info;
struct _nod *adr;
} nod;
typedef struct
{
struct _nod *cap;
} list;
list A[100001];
list B[100001];
list W[100001];
int C[100001];
int N;
int M;
int nr;
int add(list A[],int a,int b)
{
nod *nou = (nod*)malloc(sizeof(nod));
nou->info = b;
nou->adr = A[a].cap;
A[a].cap = nou;
}
void citire(void)
{
int a;
int b;
FILE *f = fopen("ctc.in","r");
fscanf(f,"%d %d",&N,&M);
for(int i=1;i<=M;i++)
{
fscanf(f,"%d %d",&a,&b);
add(A,a,b);
add(B,b,a);
}
fclose(f);
}
int add2(nod*& Cf,int a)
{
Cf->adr = (nod*)malloc(sizeof(nod));
Cf->adr->info = a;
Cf->adr->adr = NULL;
Cf = Cf->adr;
}
int parcurgere(nod*& start,list A[],int a,int k)
{
nod *Ci = (nod*)malloc(sizeof(nod));
Ci->info = a;
Ci->adr = NULL;
nod *Cf = Ci;
start = Ci;
while(Ci)
{
nod *q = A[Ci->info].cap;
while(q)
{
if(C[q->info] == k)
{
C[q->info] --;
if(C[q->info] == -2)
{
C[q->info] = nr;
add(W,nr,q->info);
}
else if(k == -1 && C[q->info] == -1)
C[q->info] = 0;
add2(Cf,q->info);
}
q = q->adr;
}
if(k)
{
q = Ci;
Ci = Ci->adr;
free(q);
}
else Ci = Ci->adr;
}
}
void afisare(void)
{
FILE *g = fopen("ctc.out","w");
fprintf(g,"%d\n",nr);
for(int i=1;i<=nr;i++)
{
nod *q = W[i].cap;
while(q)
{
fprintf(g,"%d ",q->info);
q = q->adr;
}
fprintf(g,"\n");
}
fclose(g);
}
int solve(void)
{
for(int i=1;i<=N;i++)
if(!C[i])
{
nod *q;
nod *w;
C[i] = ++nr;
add(W,nr,i);
parcurgere(q,A,i,0);
parcurgere(w,B,i,-1);
while(q)
{
if(C[q->info] == -1)
C[q->info] = 0;
w = q;
q = q->adr;
free(w);
}
}
}
int main()
{
citire();
solve();
afisare();
return 0;
}