Pagini recente » Cod sursa (job #2763562) | Borderou de evaluare (job #1567249) | Cod sursa (job #3279492) | Borderou de evaluare (job #122972) | Cod sursa (job #590862)
Cod sursa(job #590862)
#include <fstream>
#include <cstring>
#define MAX 100001
using namespace std;
ifstream in;
ofstream out;
int st[MAX],use[MAX],cnt=0;
struct list
{
int nod;
list *link;
}*v[MAX];
struct sol
{
int nod;
sol *link;
}*s[MAX];
inline void add(int x,int y)
{
list *p;
p=new list;
p->nod=y;
p->link=v[x];
v[x]=p;
}
inline void adds(int x,int y)
{
sol *p;
p=new sol;
p->nod=y;
p->link=s[x];
s[x]=p;
}
inline void dfgo(int nod)
{
list *p;
use[nod]=1;
p=v[nod];
while(p)
{
if(!use[p->nod]) dfgo(p->nod);
p=p->link;
}
st[++st[0]]=nod;
}
inline void dfback(int nod)
{
list *p;
adds(cnt,nod);
use[nod]=0;
p=v[nod];
while(p)
{
if(use[p->nod]) dfback(p->nod);
p=p->link;
}
}
int main()
{
int M,N,x,y,i;
sol *p;
in.open("ctc.in");
in>>N>>M;
for(i=1;i<=M;i++)
{
in>>x>>y;
add(x,y);
}
in.close();
memset(use,0,sizeof(use));
memset(st,0,sizeof(st));
for(i=1;i<=N;i++)
if(!use[i]) dfgo(i);
memset(v,0,sizeof(v));
in.open("ctc.in");
in>>N>>M;
for(i=1;i<=M;i++)
{
in>>x>>y;
add(y,x);
}
in.close();
for(i=N;i>0;i--)
if(use[st[i]])
{
dfback(st[i]);
cnt++;
}
out.open("ctc.out");
out<<cnt<<'\n';
for(i=0;i<cnt;i++)
{
p=s[i];
while(p)
{
out<<p->nod<<' ';
p=p->link;
}
out<<'\n';
}
out.close();
return 0;
}