Pagini recente » Cod sursa (job #1247496) | Cod sursa (job #1334908) | Cod sursa (job #2655371) | Cod sursa (job #1256770) | Cod sursa (job #771798)
Cod sursa(job #771798)
#include<fstream>
using namespace std;
int n,m,i,j;
struct lista
{int nod;
lista* next;};
lista* a[100001];
lista* b[100001];
void addplus(int x, int y)
{lista* q = new lista;
q->nod=y;
q->next=a[x];
a[x]=q;}
void addminus(int x, int y)
{lista* q = new lista;
q->nod=y;
q->next=b[x];
b[x]=q;}
ifstream f("ctc.in");
ofstream g("ctc.out");
int vizplus[100001], vizminus[100001], nrconex,lung[100001],stack[100001],nstack,poz;
void depthplus(int e)
{lista* q=a[e];
while(q)
{if(vizplus[q->nod]==0 || (vizplus[q->nod]!=vizminus[q->nod] && vizplus[q->nod]!=nrconex))
{vizplus[q->nod]=nrconex;
depthplus(q->nod);}
q=q->next;}
}
void depthminus(int e)
{lista* q=b[e];
while(q)
{if(vizminus[q->nod]==0 && vizplus[q->nod]==nrconex)
{lung[nrconex]++;
nstack++;
stack[nstack]=q->nod;
poz=nstack;
while(poz>=nstack-lung[nrconex]+1 && q->nod<stack[poz-1])
{stack[poz]=stack[poz-1];
stack[poz-1]=q->nod;
poz--;}
vizminus[q->nod]=nrconex;
depthminus(q->nod);}
q=q->next;}
}
int main()
{f>>n>>m;
int x,y;
for( i=1; i<=m; i++)
{f>>x>>y;
addplus(x,y);
addminus(y,x);}
for(i=1; i<=n; i++)
{if(vizminus[i]==0 || vizplus[i]!=vizminus[i])
{nrconex++;
lung[nrconex]=1;
vizplus[i]=nrconex;
vizminus[i]=nrconex;
nstack++;
stack[nstack]=i;
depthplus(i);
depthminus(i);}
}
g<<nrconex<<endl;
//g<<lung[1]<<" ";
int count=1;
int length=lung[1];
for(i=1; i<=n; i++)
{if(i==length+1)
{g<<endl;
count++;
//g<<lung[count]<<" ";
length+=lung[count];}
g<<stack[i]<<" ";
}
f.close();
g.close();
return 0;}