Submission

Status:
[PPPPPPPPPPPPPPPPPPPP]

Score: 100

User: fluke

Problemset: C.Love Sick

Language: cpp

Time: 0.014 second

Submitted On: 2025-03-22 19:57:41

#include <bits/stdc++.h>
#define ll long long 
#define f first
#define s second 
#define pii pair<int,ll>
#define emb emplace_back
#define em emplace 
#define all(x) x.begin(),x.end()
#define sp <<" "<<
#define DB cout<<"\n";system("pause");
using namespace std;

int di[]={0,1,0,-1,1,1,-1,-1};
int dj[]={1,0,-1,0,1,-1,1,-1};
int inf = 2e9;
ll INF = 2e18;
int mod = 1e9 + 7;

int n,m,k;

struct state{
    ll dis;
    int skip;
    int node;

    state(ll _dis , int _skip , int _node){
        dis = _dis;
        skip = _skip;
        node = _node;
    }
};

struct cmp{

    bool operator()(const state &a , const state &b){
        return a.dis > b.dis;
    }

};

bool can(ll mid ,vector <vector <pii>> &adj){
    priority_queue <state , vector <state> , cmp > pq;
    vector <vector <ll> > dis(k+1,vector <ll> (n,INF)); 
    pq.em(0,k,0);

    while(!pq.empty()){
        auto [dis_now , skip_now , node_now] = pq.top();
        pq.pop();

        if(dis[skip_now][node_now] <= dis_now || dis_now >= mid)continue;
        if(node_now == n-1)return true;
        dis[skip_now][node_now] = dis_now;

        for(auto [next_node , weight] : adj[node_now]){
            
            ll next_dis = dis_now + weight;

            if(skip_now != 0){
                if(dis[skip_now - 1][next_node] > dis_now - weight && dis_now - weight < mid){
                    pq.em(dis_now - weight , skip_now - 1 ,next_node);
                }
            }

            if(dis[skip_now][next_node] <= next_dis || next_dis >= mid)continue;
            pq.em(next_dis,skip_now,next_node);

        }
    }

    return false;

}


int main(){
ios::sync_with_stdio(false);cin.tie(0);
    cin>>n>>m>>k;
    vector <vector <pii>> adj(n);
    for(int i=0;i<m;i++){
        int x,y;
        ll z;
        cin>>x>>y>>z;
        adj[x].emb(y,z);
        adj[y].emb(x,z);
    }

    ll ans = 0;
    ll left = 0 , right = 1e9;
    while(left <= right){
        ll mid = (left + right)/2;

        // cout<<left sp right<<"\n";
        // cout<<mid;
        // DB

        if(can(mid , adj)){
            ans = mid;
            right = mid - 1;
        }
        else left = mid + 1;
    }

    cout<<ans;


}