Cod sursa(job #2275752)

Utilizator serban.ionescuionescu serban mihai serban.ionescu Data 3 noiembrie 2018 15:26:03
Problema Sortare topologica Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3 kb
#include <fstream>
#include <deque>
#include <vector>
using namespace std;
FILE*f;
FILE*g;
long long m,n,i,j,nr1,nr2,nr3,tare,c[50001],g1,i1,i2,i3,i5,cadet[50001],all,grupa[50001],k,alll,numar1,numar2,ultim,ultimul,a[100][100],prim,ult,celbun,pas,asd;
deque <int>deque1[50001],deque2[50001],deque3[50001],deque4[50001],vec[50001],dequenou[50001];
struct nod {int x;int y;int pas;} c1[50001];
void coada(int m)
{if(!deque1[m].empty())
    {
while(!deque1[m].empty())
{
    if(deque2[m].front()>=g1)
    {        int tat=deque1[m].front();
        deque1[m].pop_front();
        deque2[m].pop_front();
            tare++;
        c[tare]=tat;
        if(m==n)ultim=n;
        coada(tat);
    }
    else
    {
     deque3[m].push_front(deque1[m].front());
     deque1[m].pop_front();
     deque4[m].push_front(deque2[m].front());
     deque2[m].pop_front(); if(m==n)ultim=n;
    }}}}
int main()
{f=fopen("camionas.in","r");
g=fopen("camionas.out","w");
fscanf(f,"%d%d%d",&n,&m,&g1);
for(i=1;i<=m;i++)
    {fscanf(f,"%d%d%d",&nr1,&nr2,&nr3);
    deque1[nr1].push_front(nr2);
    deque1[nr2].push_front(nr1);
    deque2[nr1].push_front(nr3);
    deque2[nr2].push_front(nr3);}
    for(i=1;i<=n;i++)
        {if(!deque1[i].empty()){tare=1;
    c[tare]=i;all++;
        coada(i);
        if(ultim==n)
        {ultimul=all;ultim=0;}
for(j=1;j<=tare;j++)
        {grupa[c[j]]=all;}}}
        for(i=1;i<=n;i++)
        for(j=1;j<=all;j++)
            if(grupa[i]==j)
            vec[j].push_front(i);
        for(i=1;i<=all;i++)
        while(!vec[i].empty())
        {numar1=vec[i].front();
    numar2=deque3[vec[i].front()].front();
            while(!deque3[vec[i].front()].empty())
{dequenou[i].push_front(grupa[deque3[vec[i].front()].front()]);
deque3[vec[i].front()].pop_front();}
vec[i].pop_front();
        }
for(i=1;i<=all;i++)
    while(!dequenou[i].empty())
{if(i==ultimul||dequenou[i].front()==ultimul)
{
     a[i][dequenou[i].front()]=2;
    a[dequenou[i].front()][i]=2;
}else
    {a[i][dequenou[i].front()]=1;
    a[dequenou[i].front()][i]=1;}
    dequenou[i].pop_front();
}
c1[1].pas=1;
c1[1].x=1;
c1[1].y=1;
prim=1;
ult=1;
while(prim<=ult)
{
    for(i=1;i<=all;i++)
        {if(a[i][c1[prim].y]==1)
        {
            ult++;
            c1[ult].x=i;
            c1[ult].y=c1[prim].y;
            c1[ult].pas=c1[prim].pas+1;
        }
        else
            if(a[i][c1[prim].y]==2)
        {asd=1;celbun=ult+1;c1[celbun].pas=c1[prim].pas+1;}}
        if(asd==1) break;
        for(i=1;i<=all;i++)
        {
            if(a[c1[prim].x][i]==1)
            {
                ult++;
                c1[ult].x=c1[prim].x;
                c1[ult].y=i;
                c1[ult].pas=c1[prim].pas+1;
            }
            else
                if(a[c1[prim].x][i]==2)
            {
                asd=1;celbun=ult+1;c1[celbun].pas=c1[prim].pas+1;
            }
        }
        if(asd==1)break;
}

fprintf(g,"%d",c1[celbun].pas-1);

    return 0;
}