Cod sursa(job #2671617)

Utilizator Edwuard99Diaconescu Vlad Edwuard99 Data 12 noiembrie 2020 14:21:06
Problema PScNv Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.32 kb
#include <cstdio>
#include <cstdlib>


#define NMAX 262144
#define KMAX 1024
#define INF "pscnv.in"
#define OUF "pscnv.out"
#define DAD(a) (a/2)
#define ST(a) (2*a)
#define DR(a) (2*a+1)
#define MAX(a,b) ((a>b)?(a):(b))
using namespace std;
int best[NMAX],n,m;
struct nod
{
    int c,k;
    nod *next;
};
struct head
{
    nod *p,*q;

}lst[NMAX];
struct intnod
{
    int c;
    intnod *next;
};
struct intlist
{
    intnod *p,*q;
    void push_back(int x);
    void print();
};
void intlist::push_back(int x)
{
    intnod *id;
    id=new intnod;
    id->c=x;id->next=NULL;
    if(p==NULL) p=q=id;
    else
    {
        q->next=id;
        q=id;
    }
};
void intlist::print()
{
    intnod *op;
    op=p;
    while(op) { printf("%d ",op->c);op=op->next; }
    printf("\n");
}
void kmin(int source)
{
    register int nd,aux,i,j;
    nod *op;
    intnod *po;
    intlist lt[KMAX];
    for(i=0;i<KMAX;i++) lt[i].p=lt[i].q=NULL;
    lt[0].push_back(source);po=lt[0].p;
    j=0;nd=0;
    for(i=1;i<=n;++i)
    {
        aux=0;
        while(j<KMAX&&!aux)
        {
            //lt[j].print();
            po=lt[j].p;
            if(po!=NULL)
            {
                do{
                    nd=po->c;po=po->next;
                    lt[j].p=po;
                    if(best[nd]==j) aux=1;
                }while(!aux&&po!=NULL);
                if(!aux) j++;
            }
            else j++;
        }
        op=lst[nd].p;
        //printf("ND:  %d\n",nd);
        while(op!=NULL)
        {
            aux=MAX(best[nd],op->k);
            if(aux<best[op->c])
            {
                best[op->c]=aux;
                lt[aux].push_back(op->c);
                //if(aux==j&&po==NULL) po=lt[j].p;
            }
            op=op->next;
        }

    }
}

int  main()
{
    register int x,y,i,a,b,pd;
    nod *op;
    FILE *in,*out;
    in=fopen(INF,"r");
    out=fopen(OUF,"w");
    fscanf(in,"%d %d %d %d",&n,&m,&x,&y);
    for(i=1;i<=n;i++){ lst[i].p=lst[i].q=NULL;best[i]=KMAX;}
    for(i=1;i<=m;i++)
    {
        fscanf(in,"%d %d %d",&a,&b,&pd);
        if(a!=b)
        {
            op=new nod;
            op->c=b;op->k=pd;op->next=NULL;
            if(lst[a].p==NULL) lst[a].p=lst[a].q=op;
            else {lst[a].q->next=op;lst[a].q=op;}
        }
    };
    best[x]=0;
    kmin(x);
    fprintf(out,"%d",best[y]);
    fclose(in);fclose(out);
    return 0;
}