Cod sursa(job #1527197)

Utilizator livliviLivia Magureanu livlivi Data 17 noiembrie 2015 21:57:34
Problema PScNv Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include<cstdio>
#include<vector>
#define N 250000
#define M 500000
#define K 1000
using namespace std;

int lst[N+1];
int urm[M+1];
int vecin[M+1];
int cost[M+1];
int d[N+1];

vector<int> liste[K+1];

int k;

bool viz[N+1];


void adauga(int aux,int i){
    urm[i]=lst[aux];
    lst[aux]=i;
}


int schimba(int p){
    p++;
    while(p==liste[k].size()){
        k++;
        p=0;
    }
    return p;
}


void bfs(int x,int y){
    int p,i;
    k=0;

    liste[k].push_back(x);
    p=0;
    while(viz[y]==false){
        while(viz[liste[k][p]]==true) p=schimba(p);

        x=liste[k][p];
        viz[x]=true;

        i=lst[x];
        while(i>0){
            if (viz[vecin[i]]==false &&(d[vecin[i]]>cost[i] ||d[vecin[i]]==-1)){
                liste[cost[i]].push_back(vecin[i]);
                d[vecin[i]]=cost[i];
            }
            i=urm[i];
        }
    }
}


int main(){
    freopen ("pscnv.in","r",stdin);
    freopen ("pscnv.out","w",stdout);
    int n,m,i,x,y,aux;

    scanf ("%d%d%d%d",&n,&m,&x,&y);

    for(i=1;i<=m;i++){
        scanf ("%d%d%d",&aux,&vecin[i],&cost[i]);
        adauga(aux,i);
    }

    for(i=1;i<=n;i++)
        d[i]=-1;

    bfs(x,y);

    printf ("%d",d[y]);
    return 0;
}