Pagini recente » Cod sursa (job #1398745) | Cod sursa (job #2674958) | Cod sursa (job #3040693) | Cod sursa (job #36150) | Cod sursa (job #624348)
Cod sursa(job #624348)
#include <fstream>
#include <set>
using namespace std;
ifstream f("ctc.in");
ofstream g("ctc.out");
struct nod
{
int nr;
nod *next;
} *v[5005],*p,*vt[5005],*comp[5005];
set <int> pluss;
set <int> :: iterator it,o;
int n,m,a,b,minim,k;
char prez[5005];
void DFSp(int);
void DFSm(int);
int main()
{
int i;
f>>n>>m;
minim=1;
for(i=1;i<=m;++i)
{
f>>a>>b;
//adaug vecinul b la lista lui a in G
p=new nod;
p->nr=b;
p->next=v[a];
v[a]=p;
//adaug vecinul a la lista lui b in G(t)
p=new nod;
p->nr=a;
p->next=vt[b];
vt[b]=p;
}
//afisare de control
/*for(i=1;i<=n;++i)
{
p=v[i];
g<<'\n'<<i<<": ";
while(p)
{
g<<p->nr<<' ';
p=p->next;
}
}
//g.flush();
g<<"\n\n";*/
//afisarea multimilor DFSp, DFSm
while(minim<=n)
{
++k;
prez[minim]='1';
pluss.clear();
pluss.insert(minim);
//g<<minim<<' ';
p=new nod;
p->nr=minim;
p->next=comp[k];
comp[k]=p;
DFSp(minim);
DFSm(minim);
while(prez[minim]) ++minim;
}
g<<k<<'\n';
for(i=1;i<=k;++i)
{
p=comp[i];
while(p)
{
g<<p->nr<<' ';
p=p->next;
}
g<<'\n';
}
f.close(); g.close();
return 0;
}
void DFSp(int x)
{
nod *q=v[x];
while(q)
{
//daca am un vecin vizitat ma duc la urmatorul
if(!prez[q->nr] && pluss.find(q->nr)==pluss.end()){pluss.insert(q->nr);DFSp(q->nr);}
q=q->next;
}
}
void DFSm(int x)
{
nod *q=vt[x];
while(q)
{
//daca am un vecin vizitat ma duc la urmatorul
if(prez[q->nr])
{
q=q->next;
continue;
}
if(pluss.find(q->nr)!=pluss.end())
{
/*g<<q->nr<<' '*/
p=new nod;
p->nr=q->nr;
p->next=comp[k];
comp[k]=p;
prez[q->nr]='1';
pluss.erase(q->nr);
}
DFSm(q->nr);
q=q->next;
}
}