Mai intai trebuie sa te autentifici.
Cod sursa(job #1794531)
Utilizator | Data | 1 noiembrie 2016 13:50:49 | |
---|---|---|---|
Problema | PScNv | Scor | 80 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 2.23 kb |
#include <iostream>
#include<fstream>
#include<vector>
#define Nmax 250001
#define inf 10000000
using namespace std;
ifstream f("pscnv.in");
ofstream g("pscnv.out");
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()
{
f>>n>>m>>x>>y;
for(;m;m--)
{
f>>i>>j>>cst;
v[i].push_back(make_pair(j,cst));
}
Dijkstra(x);
g<<sol;
}