Cod sursa(job #3342683)

Utilizator tonealexandruTone Alexandru tonealexandru Data 25 februarie 2026 11:07:35
Problema PScNv Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <bits/stdc++.h>
#pragma optimize("Ofast")
#pragma optimize("unroll-loops")
#define int long long

using namespace std;

const int NMAX = 250005;

vector<pair<int, int>> adj[NMAX];
priority_queue<pair<int, int>> q;
int save[NMAX];

map<pair<int, int>, int> mp;

signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    ifstream cin("pscnv.in");
    ofstream cout("pscnv.out");
    int n, m, x, y, a, b, val, maxx = 0;
    cin>>n>>m>>x>>y;

    for(int i=0; i<m; i++)
    {
        cin>>a>>b>>val;

        if(a == b) continue;

        if(mp[{a, b}] == 0 ||  val < mp[ {a, b}] )
        {
            mp[ {a, b}] = val;

            adj[a].push_back({b, val});
            maxx = max(maxx, val);
        }
    }

    int st = 0, dr = maxx, rez = -1;
    while(st <= dr)
    {
        int mij = (st + dr) / 2;
        //cout<<mij<<'\n';

        for(int i=1; i<=n; i++)
            save[i] = 21e8;

        q.push({0, x});
        save[x] = 0;

        while(q.empty() == false)
        {
            int cur = q.top().second;
            q.pop();

            if(cur == y)
                break;

            for(auto xi : adj[cur])
            {
                if(save[xi.first] > save[cur] + xi.second && xi.second <= mij)
                {
                    save[xi.first] = save[cur] + xi.second;
                    q.push({save[xi.first] * (-1), xi.first});
                }
            }
        }

        if(save[y] != 21e8) /// e ok
        {
            dr = mij - 1;
            rez = mij;
        }
        else
            st = mij + 1;
    }

    cout<<rez;



    return 0;
}