Hackerrank Jack Goes To Rapture Solution

#include <iostream>
#include <vector>
#include <algorithm>
#include <utility>
using namespace std;
vector<int> p(50001),rnk(50001,1),cost(50001);
int n,e;
int find(int a){
    return p[a]==a?a:p[a]=find(p[a]);
}
bool same(int a,int b){
    return find(a)==find(b);
}
void merge(int a,int b,int money){
    if(p[a]==a)
        cost[a]=money;
    if(p[b]==b)
        cost[b]=money;
    if(!same(a,b)){
        if(rnk[find(a)]>rnk[find(b)]){
            cost[find(a)]=max(money,max(cost[find(a)],cost[find(b)]));
            p[find(b)]=find(a);
        }
        else {
            cost[find(b)]=max(money,max(cost[find(a)],cost[find(b)]));
            p[find(a)]=find(b);
        }
        if(rnk[find(a)]==rnk[find(b)])
            rnk[find(b)]++;
    }
}
int main(){
    cin>>n>>e;
    vector<pair<int,pair<int,int> > > E(e);
    for(int i=1;i<=n;i++)
        p[i]=i;
    for(int i=0;i<e;i++){
        int x,y,w;
        cin>>x>>y>>w;
        E[i]={w,{x,y}};
    }
    sort(E.begin(),E.end());
    // for(auto i:E){
    //     cout<<i.first<<' ';
    // }
    for(int i=0;i<e;i++){
        merge(E[i].second.first,E[i].second.second,E[i].first);
        if(same(1,n))break;
    }
    if(!same(1,n))cout<<"NO PATH EXISTS"<<endl;
    else cout<<cost[find(n)]<<endl;
}

Comments