Cod sursa(job #1914028)

Utilizator andreizaicescuAndrei Zaicescu andreizaicescu Data 8 martie 2017 15:10:51
Problema Componente tare conexe Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.43 kb
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f("graf.in");
ofstream g("graf.out");
struct el{int nod; int urm;};
el a[15000];
struct pt{int nod; int poz;};
pt v1[7501],v2[7501];
int n,m,x,y,l[7501],vv[7501],k,xx,yy,p,ll,ok;
bool viz[7501];
void ad(int x, int y)
{
    k++;
    a[k].nod=y;
    a[k].urm=l[x];
    l[x]=k;
}
void sterg()
{
    for(int i=1;i<=n;i++)
        viz[i]=0;
}
void parc(int nd)
{
    viz[nd]=1;
    v1[1].nod=nd;
    v1[1].poz=0;
    int in=1,sf=1,poz;
    while(in<=sf)
    {
        poz=l[v1[in].nod];
        while(poz)
        {
            if(viz[a[poz].nod]==0)
            {
                sf++;
                v1[sf].nod=a[poz].nod;
                v1[sf].poz=v1[in].poz+1;
                viz[a[poz].nod]=1;
            }
            poz=a[poz].urm;
        }
        in++;
    }
}
void parc2(int nd)
{
    viz[nd]=1;
    v2[1].nod=nd;
    v2[1].poz=0;
    int in=1,sf=1,poz;
    while(in<=sf)
    {
        poz=l[v2[in].nod];
        while(poz)
        {
            if(viz[a[poz].nod]==0)
            {
                sf++;
                v2[sf].nod=a[poz].nod;
                v2[sf].poz=v2[in].poz+1;
                viz[a[poz].nod]=1;
            }
            poz=a[poz].urm;
        }
        in++;
    }
}
int cmp(el x, el y)
{
    if(x.nod<=y.nod)
        return 1;
    return 0;
}
int main()
{
    f>>n>>m>>x>>y;
    for(int i=1;i<=m;i++)
    {
        f>>xx>>yy;
        ad(xx,yy);
        ad(yy,xx);
    }
    int n1,poz,pozv;
    parc(x);
    sterg();
    parc2(y);
    for(int i=1;i<=n;i++)
        if(v1[i].nod==y)
    {
        n1=i;
        ll=v1[i].poz;
        i=n+1;
    }
    a[1].nod=x;
    a[2].nod=y;
    a[1].urm=0;
    a[2].urm=0;
    int i;
    k=2;
    poz=1;
    pozv=ll-poz;
    int n2=n1;
    for(i=2;i<=n2;i++)
     {
         pozv=ll-poz;
        while(v1[i].poz==v1[i+1].poz) i++;
        while(v2[n1-1].poz==pozv)
        {
            if(a[k].urm==ll-pozv)
            {
                k--;
                while(v2[n1-1].poz==pozv) n1--;
                n1++;
            }
            else
            {
                k++;
                a[k].nod=v1[i].nod;
                a[k].urm=v1[i].poz;
            }
            n1--;
        }
        poz++;
     }
     sort(a+1,a+1+k,cmp);
    for(int i=1;i<=k;i++)
            g<<a[i].nod<<" ";
    return 0;
}