High Score

Hard C++

Key Idea: Solution implementation

Solution

#include <bits/stdc++.h>
using namespace std;
//author: von_Braun
#define ll long long
#define lli long long int
#define pb push_back
#define rep(var, start, num) for(ulli var = start; var <start + num; var++)
#define all(x) x.begin(), x.end()
#define ulli unsigned long long int
#define ull unsigned long long
bool sortbysec(const pair<ll,ll> &a,const pair<ll,ll> &b) { return (a.second < b.second); }
//just check if node a and b are connected or not.

// void bfs(int n, vector<vector<ll int>> &adj, int v, vector<int> &vis) {
//     vis[n] = v;
//     for(auto x:adj[n]) {
//         if (vis[x] == 0) {
//             dfs(x, adj, v, vis);
//         }
//     }
// }

void dijkstra(vector<vector<ll int>> &adj, int n, vector<lli> &dist) {
    priority_queue<pair<lli,lli>, vector<pair<lli,lli>>, greater<pair<ll,ll>>> pq;
    // vector<int> dist(n+1,INT_MAX);
    pq.push({0, n});
    dist[n] = 0;
    while(!pq.empty()) {
        pair<lli,lli> sn = pq.top();
        pq.pop();
        int curnode = sn.second;
        int curdis = sn.first;
        if (dist[curnode] < curdis) {continue;}
        for(auto x:adj[curnode]) {
            if (dist[curnode] + 1 < dist[x]) {
                dist[x] = 1 + dist[curnode];
                pq.push({dist[x], x});
            }
        }
    }
}

void solve() {
    ll int n,m,a,b,c;
    cin>>n>>m;
    vector<vector<ll>> adj(n+1), adjr(n+1);
    vector<tuple<ll int,ll int,ll int>> v;
    rep(i,0,m) {
        cin>>a>>b>>c;
        v.pb({a,b,c});
        adj[b].pb(a);
        adjr[a].pb(b);
    }       

    vector<ll int> dist1(n+1,INT64_MAX-10), dist2(n+1, INT64_MAX-10);
    int z=1;
    dijkstra(adj, n, dist1);
    dijkstra(adjr, 1, dist2);
    // for(int i = 1;i<=n;i++) {cout<<vis[i]<<" ";} cout<<endl;
    vector<ll int> dist(n+1,INT64_MIN+10);
    dist[1] = 0;
    rep(i,0,n+1) {
        rep(j,0,m) {
            ll int sn = get<0>(v[j]);
            ll int en = get<1>(v[j]);
            ll int x = get<2>(v[j]);
            if (!((dist[sn]==INT64_MIN + 10) && x < 0)) {
            dist[en] = max(dist[sn] + x, dist[en]);
            }
        }
    }
    bool fl=0;
    rep(j,0,m) {
            ll int sn = get<0>(v[j]);
            ll int en = get<1>(v[j]);
            ll int x = get<2>(v[j]);
            if (dist[en] < dist[sn] + x) {
                // cout<<"hi\n";
                // if (vis[en] == vis[n]) {
                // fl=1; break;
                // }
                if ((dist1[sn] != INT64_MAX-10||dist1[en]!=INT64_MAX-10) && (dist2[sn]!=INT64_MAX-10||dist2[en]!=INT64_MAX-10)) {fl=1; break;}
                //check if path exists from en to n
            }
            
            if (!((dist[sn]==INT64_MIN + 10) && x < 0)) {
            dist[en] = max(dist[sn] + x, dist[en]);
            }
            // dist[en] = max(dist[sn] + x, dist[en]);
    }
    if (fl) {cout<<"-1\n";} else {cout<<dist[n]<<endl;}
    cout<<INT64_MAX - dist[n]<<endl;
}

int main() {
    //add quotes incase input output file
    //freopen(input.txt,r,stdin);
    //freopen(output.txt,w,stdout);
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    int tc = 1;
    // cin >> tc;
    for (int t = 1; t <= tc; t++) {
        solve();
    }
}