제출 #1256808

#제출 시각아이디문제언어결과실행 시간메모리
1256808tradzAesthetic (NOI20_aesthetic)C++20
0 / 100
175 ms40244 KiB

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll INF = (1LL<<62);

struct Edge { int u,v; long long w; int idx; };

int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int N, M;
    if(!(cin >> N >> M)) return 0;
    vector<Edge> edges;
    edges.reserve(M);
    vector<vector<pair<int,long long>>> g(N+1);
    for(int i=1;i<=M;i++){
        int a,b; long long w;
        cin >> a >> b >> w;
        edges.push_back({a,b,w,i});
        g[a].push_back({b,w});
        g[b].push_back({a,w});
    }

    auto dijkstra = [&](int src){
        vector<long long> dist(N+1, INF);
        priority_queue<pair<long long,int>, vector<pair<long long,int>>, greater<pair<long long,int>>> pq;
        dist[src]=0;
        pq.push({0,src});
        while(!pq.empty()){
            auto [d,u]=pq.top(); pq.pop();
            if(d!=dist[u]) continue;
            for(auto &e: g[u]){
                int v=e.first; long long w=e.second;
                if(dist[v] > dist[u] + w){
                    dist[v] = dist[u] + w;
                    pq.push({dist[v], v});
                }
            }
        }
        return dist;
    };

    auto dist1 = dijkstra(1);
    auto distN = dijkstra(N);
    long long orig = dist1[N];
    // If orig is INF, graph disconnected (but problem guarantees connected)
    // Prepare suffix maximum P_i by original order 1..M
    vector<long long> P(M+2, 0);
    // map index->W
    vector<long long> W(M+1);
    for(auto &e: edges) W[e.idx] = e.w;
    for(int i=M;i>=1;i--){
        P[i] = max(P[i+1], W[i]);
    }

    long long ans = orig;
    for(auto &e: edges){
        int i = e.idx;
        long long add = P[i+1]; // largest W_j with j>i
        if(add==0) continue; // no larger-index edge to replicate
        // two possible orientations
        long long cand1 = INF, cand2 = INF;
        if(dist1[e.u]!=INF && distN[e.v]!=INF){
            cand1 = dist1[e.u] + e.w + add + distN[e.v];
        }
        if(dist1[e.v]!=INF && distN[e.u]!=INF){
            cand2 = dist1[e.v] + e.w + add + distN[e.u];
        }
        long long cand = min(orig, min(cand1, cand2));
        // We want the shortest path length after performing this extension.
        // Using min(orig, ...) is safe because other routes might remain orig.
        if(cand>ans) ans=cand;
    }

    cout << ans << "\n";
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...