CCCPaste

Untitled

#include 
#include 
#include 
#include 
#include 
using namespace std;
vector > graph[300];
int n, m;
struct node {
    int idx, shortest_path;
    node(int _idx, int _shortest_path) {
        idx = _idx;
        shortest_path = _shortest_path;
    }
    bool operator < (const node &tmp) const {
        return shortest_path > tmp.shortest_path;
    }
};
vector dijkstra() {
    vector visited(n + 5, false);
    vector dist(n + 5, 2e9);
    vector path(n + 5, -1);
    priority_queue pq;
    pq.push(node(1, 0));
    while(!pq.empty()) {
        node current = pq.top();
        pq.pop();
        visited[current.idx] = true;
        
        if(current.idx == n) {
            break;
        }
        
        for(int i = 0; i < graph[current.idx].size(); i++) {
            int sosed = graph[current.idx][i].first;
            int pat = graph[current.idx][i].second;
            
            if(!visited[sosed] and current.shortest_path + pat < dist[sosed]) {
                dist[sosed] = current.shortest_path + pat;
                pq.push(node(sosed, current.shortest_path + pat));
                path[sosed] = current.idx;
            }
        }
    }
    int A = 1, B = n;
    vector result;
    while(B != A) {
        result.push_back(B);
        B = path[B];
    }
    result.push_back(A);
    return result;
}
int dijkstra_shortest_path() {
    vector visited(n + 5, false);
    vector dist(n + 5, 2e9);
    priority_queue pq;
    pq.push(node(1, 0));
    while(!pq.empty()) {
        node current = pq.top();
        pq.pop();
        visited[current.idx] = true;
        
        if(current.idx == n) {
            return current.shortest_path;
        }
        
        for(int i = 0; i < graph[current.idx].size(); i++) {
            int sosed = graph[current.idx][i].first;
            int pat = graph[current.idx][i].second;
            
            if(!visited[sosed] and current.shortest_path + pat < dist[sosed]) {
                dist[sosed] = current.shortest_path + pat;
                pq.push(node(sosed, current.shortest_path + pat));
            }
        }
    }
    return -2e9;
}
int main() {
    ios_base::sync_with_stdio(0);
    ifstream cin("rblock.in");
    ofstream cout("rblock.out");
    cin >> n >> m;
    for(int i = 0; i < m; i++) {
        int a, b, c;
        cin >> a >> b >> c;
        graph[a].push_back(make_pair(b, c));
        graph[b].push_back(make_pair(a, c));
    }
   vector path =  dijkstra();
    int initital_shortest = dijkstra_shortest_path();
    int maximum = 0;
    for(int i = 0; i + 1 < path.size(); i++) {
        int idx1 = -1;
        for(int j = 0; j < graph[path[i]].size(); j++) {
            if(graph[path[i]][j].first == path[i + 1]) {
                graph[path[i]][j].second *= 2;
                idx1 = j;
                break;
            }
        }
        int idx2 = -1;
        for(int j = 0; j < graph[path[i + 1]].size(); j++) {
            if(graph[path[i + 1]][j].first == path[i]) {
                graph[path[i + 1]][j].second *= 2;
                idx2 = j;
                break;
            }
        }
        maximum = max(maximum, dijkstra_shortest_path());
        graph[path[i]][idx1].second /= 2;
        graph[path[i + 1]][idx2].second /= 2;
        
    }
    cout << maximum - initital_shortest << endl;
    return 0;
}