178762025-09-20 16:13:46DávidNagysebességű vasútcpp17Hibás válasz 30/100609ms17292 KiB
#include <bits/stdc++.h>
#include <functional>
#include <queue>
#include <vector>
using namespace std;
#define pii pair<int, int>
#define ll long long
#define pli pair<ll, int>

const ll INF = 1e12;

void dijkstra(int s, vector<vector<pii>> &graf, vector<ll> &tav, vector<int> &honnan) {
    priority_queue<pli, vector<pli>, greater<pli>> q;
    q.push({0, s});
    tav[s] = 0;
    while(!q.empty()) {
        int index = q.top().second;
        ll d = q.top().first;
        q.pop();
        if(d != tav[index]) continue;
        for(pii el : graf[index]) {
            int cel = el.first;
            int w = el.second;
            if(tav[index] + w < tav[cel]) {
                tav[cel] = tav[index] + w;
                q.push({tav[cel], cel});
                honnan[cel] = index;
            }
        }
    }
}

int main() {
	int n, m;
    cin >> n >> m;
    vector<vector<pii>> graf(n);
    vector<ll> a(n, INF), b(n, INF);
    vector<int> honnan(n, -1);
    for(int i = 0; i < m; i++) {
        int x, y, w;
        cin >> x >> y >> w;
        graf[x].push_back({y, w});
        graf[y].push_back({x, w});
    }
    dijkstra(0, graf, a, honnan);
    dijkstra(n - 1, graf, b, honnan);
    vector<bool> ut(n);
    int most = 0;
    while(most != n - 1) {
        ut[most] = true;
        most = honnan[most];
    }
    ut[n - 1] = true;
    //for(int i = 0; i < n; i++) if(ut[i]) cout << i << " ";
    //cout << endl;
    //cout << b[1] << " " << a[2] << endl;
    unsigned int eredmeny = -1;
    for(int i = 0; i < n; i++) {
        for(pii el : graf[i]) {
            int index = el.first;
            int w = el.second;
            int kell = b[0] - min(a[i] + b[index], b[i] + a[index]) - 1;
            if((!ut[i] || !ut[index]) && kell < w && kell > 0) eredmeny = min(eredmeny, (unsigned int)(w - kell));
            kell = b[0] - min(a[index] + b[i], b[index] + a[i]) - 1;
            if((!ut[i] || !ut[index]) && kell < w && kell > 0) eredmeny = min(eredmeny, (unsigned int)(w - kell));
            //cout << i << " " << index << " " << kell << endl;
        }
    }
    cout << (int)eredmeny << endl;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva1ms316 KiB
2Elfogadva1ms508 KiB
subtask20/35
3Hibás válasz4ms316 KiB
4Hibás válasz4ms500 KiB
5Elfogadva3ms316 KiB
6Elfogadva4ms316 KiB
7Elfogadva3ms316 KiB
8Elfogadva3ms316 KiB
subtask330/30
9Elfogadva165ms7732 KiB
10Elfogadva149ms7732 KiB
11Elfogadva164ms7732 KiB
12Elfogadva148ms7756 KiB
13Elfogadva136ms7636 KiB
14Elfogadva143ms7760 KiB
subtask40/35
15Hibás válasz556ms16740 KiB
16Hibás válasz560ms16776 KiB
17Hibás válasz609ms16664 KiB
18Hibás válasz606ms16684 KiB
19Elfogadva552ms17188 KiB
20Elfogadva555ms17292 KiB
21Elfogadva595ms17060 KiB
22Elfogadva595ms17208 KiB
23Elfogadva537ms17196 KiB
24Elfogadva270ms10036 KiB
25Elfogadva164ms7740 KiB
26Elfogadva163ms7752 KiB
27Elfogadva149ms7732 KiB