Pagini recente » Cod sursa (job #790007) | Cod sursa (job #2523770) | Cod sursa (job #846516) | Cod sursa (job #2756629) | Cod sursa (job #202542)
Cod sursa(job #202542)
#include<stdio.h>
FILE *f,*g;
long n,m,t[3][200005],i,x,y,c[100005],nr,v,viz[100005],plus1[100005],plus2[100005],tt[3][200005],ct[100005],nrt,j;
int dfs1(long i)
{ plus1[i]=x; v=c[i]; if(v!=0) dfs1(t[1][v]);
v=c[i];
while(v!=0)
{ v=t[2][v];
if(plus1[t[1][v]]!=x) dfs1(t[1][v]);
}
return 0;
}
int dfs2(long i)
{ plus2[i]=x; v=ct[i]; if(v!=0) dfs2(tt[1][v]);
v=ct[i];
while(v!=0)
{ v=tt[2][v];
if(plus2[tt[1][v]]!=x) dfs2(tt[1][v]);
}
return 0;
}
int main()
{ f=fopen("dfs.in","r"); g=fopen("dfs.out","w");
fscanf(f,"%ld%ld",&n,&m);
t[1][0]=1; tt[1][0]=1;
for(i=1;i<=m;i++)
{ fscanf(f,"%ld%ld",&x,&y);
if(!c[x])
{ while(t[1][nr]!=0) nr++;
c[x]=nr;
t[1][nr]=y;
}
else
{ v=c[x];
while(t[2][v]!=0) v=t[2][v];
while(t[1][nr]!=0) nr++;
t[2][v]=nr; t[1][nr]=y;
}
v=x; x=y; y=v;
if(!ct[x])
{ while(tt[1][nrt]!=0) nrt++;
ct[x]=nrt;
tt[1][nr]=y;
}
else
{ v=ct[x];
while(tt[2][v]!=0) v=tt[2][v];
while(tt[1][nrt]!=0) nrt++;
tt[2][v]=nrt; tt[1][nrt]=y;
}
}
nr=0; x=0; t[1][0]=0; tt[1][0]=0;
for(i=1;i<=n;i++)
{ if(!viz[i])
{ nr++;
x++; dfs1(i); dfs2(i);
for(j=1;j<=n;j++) if(plus1[j]==x&&plus2[j]==x) viz[j]=1;
}
}
fprintf(g,"%ld",nr); fclose(g);
return 0;
}