Cod sursa(job #1795162)

Utilizator GeanaVladGeana Vlad GeanaVlad Data 2 noiembrie 2016 01:11:01
Problema PScNv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.9 kb
#include <iostream>
#include<cstdio>
#include<vector>
#define Nmax 250001
#define inf 10000
using namespace std;
#define DIM 10000
char buff[DIM];
int poz=0;

void citeste(int &numar)
{
    numar = 0;
    //cat timp caracterul din buffer nu e cifra ignor
    while (buff[poz] < '0' || buff[poz] > '9')
        //daca am "golit" bufferul atunci il umplu
        if (++poz == DIM)
            fread(buff,1,DIM,stdin),poz=0;
    //cat timp dau de o cifra recalculez numarul
    while ('0'<=buff[poz] && buff[poz]<='9')
    {
        numar = numar*10 + buff[poz] - '0';
        if (++poz == DIM)
            fread(buff,1,DIM,stdin),poz=0;
    }
}
int n,m,x,y,i,j,cst,sol,vf[inf],cost[Nmax],exist[Nmax],mx;
vector<pair<int,int> >v[Nmax];
void Dijkstra(int p)
{
    int i,nod,sz,mn,k;
    for(i=1;i<=n;i++)
        cost[i]=inf;
    cost[p]=0;
    vf[0]=p;
    bool ok=0;
    while(!ok)
    {
        ok=1;
        for(i=0; i<=mx && ok; i++)
            if(vf[i] && !exist[vf[i]])
            {
                ok=0;
                mn=i;
                nod=vf[i];
            }
        sol=max(sol,mn);
        if(nod==y)
            ok=1;
        if(!ok)
        for(k=0; k<v[nod].size(); k++)
            if(!exist[v[nod][k].first])
            {
                if(cost[v[nod][k].first] > v[nod][k].second)
                {
                    cost[v[nod][k].first] = max(sol,v[nod][k].second);
                    vf[cost[v[nod][k].first]]=v[nod][k].first;
                }
            }
        exist[nod]=1;
    }
}
int main()
{
    freopen("pscnv.in","r",stdin);
    freopen("pscnv.out","w",stdout);
    citeste(n);
    citeste(m);
    citeste(x);
    citeste(y);
    for(; m; m--)
    {
        citeste(i);
        citeste(j);
        citeste(cst);
        v[i].push_back(make_pair(j,cst));
        mx=max(mx,cst);
    }
    Dijkstra(x);
    cout<<sol;
}