Cod sursa(job #1794541)

Utilizator GeanaVladGeana Vlad GeanaVlad Data 1 noiembrie 2016 14:07:23
Problema PScNv Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.9 kb
#include <iostream>
#include<cstdio>
#include<vector>
#define Nmax 250001
#define inf 10000000
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;
     }
}
struct heap
{
    int nod,cost;
};
heap h[Nmax];
int n,m,x,y,i,j,cst,heap_node[Nmax],sol,muchie,jh;
vector<pair<int,int> >v[Nmax];
void up(int p)
{
    while(p>1 && h[p].cost<h[p/2].cost)
    {
        swap(heap_node[h[p].nod],heap_node[h[p/2].nod]);
        swap(h[p],h[p/2]);
        p/=2;
    }
}
void down(int p)
{
    if((p<<1)<=n && (p<<1)+1<=n && h[p<<1].cost<h[(p<<1)+1].cost && h[p<<1].cost<h[p].cost)
    {
        swap(heap_node[h[p].nod],heap_node[h[p<<1].nod]);
        swap(h[p],h[p<<1]);
        down(p<<1);
    }
    else
    if((p<<1)<=n && (p<<1)+1<=n && h[p<<1].cost>h[(p<<1)+1].cost && h[(p<<1)+1].cost<h[p].cost)
    {
        swap(heap_node[h[p].nod],heap_node[h[(p<<1)+1].nod]);
        swap(h[p],h[(p<<1)+1]);
        down((p<<1)+1);
    }
    else
    if((p<<1)<=n && h[p<<1].cost<h[p].cost)
    {
        swap(heap_node[h[p].nod],heap_node[h[p<<1].nod]);
        swap(h[p],h[p<<1]);
        down(p<<1);
    }
}

inline void cut(int k)
{
    swap(heap_node[h[k].nod],heap_node[h[n].nod]);
    swap(h[k],h[n]);
    n--;
    up(k);
    down(k);
}
inline void BuildHeap()
{
    for(int i=2;i<=n;i++)
        up(i);
}
inline int extractMin()
{
    return h[1].nod;
}
void Dijkstra(int p)
{
    int i,k;
    for(i=1;i<=n;i++)
    {
        heap_node[i]=i;
        h[i].cost=inf;
        h[i].nod=i;
    }
    h[p].cost=0;
    BuildHeap();
    bool ok=1,ok1=1;
    while(n>1 && ok)
    {
        j=extractMin();
        if(j==y)
            ok=0;
        sol=max(sol,h[heap_node[j]].cost);
        for(k=0;k<v[j].size()&&ok;k++)
            if(heap_node[v[j][k].first]<=n)
        {
            muchie=v[j][k].second;
            jh=heap_node[v[j][k].first];
            if(muchie<h[jh].cost)
            {
                h[jh].cost=max(sol,muchie);
                up(jh);
            }
        }
        cut(heap_node[j]);
    }
}
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));
    }
    Dijkstra(x);
    cout<<sol;
}