Submission #1115322

#TimeUsernameProblemLanguageResultExecution timeMemory
1115322staszic_ojuzCommuter Pass (JOI18_commuter_pass)C++17
0 / 100
405 ms262144 KiB
#include <iostream>
#include <vector>
#include <queue>
#include <utility>
using namespace std;

struct State{
    long long v, dist;
    vector<long long> path;
};

bool comp(const State &s1, const State &s2){
    return s1.dist>s2.dist;
}

vector<vector<pair<long long, long long>>> graph;
vector<bool> found;
vector<pair<long long, long long>> freeEdges;

State Dijkstra(long long v1, long long v2, bool pathRecovery){
    for (long long i=0;i<found.size();i++) found[i]=false;
    priority_queue<State, vector<State>, bool (*)(const State &, const State &)> pq(comp);
    pq.push(State{v1, 0, vector<long long>{v1}});
    while (!pq.empty()){
        State sta=pq.top();
        pq.pop();
        found[sta.v]=true;
        if (sta.v==v2) return sta;
        for (long long i=0;i<graph[sta.v].size();i++){
            if (!found[graph[sta.v][i].first]){
                long long addedCost=graph[sta.v][i].second;
                if (graph[sta.v][i].first==freeEdges[sta.v].first||graph[sta.v][i].first==freeEdges[sta.v].second) addedCost=0;
                if (pathRecovery){
                    vector<long long> temp=sta.path;
                    temp.push_back(graph[sta.v][i].first);
                    pq.push(State{graph[sta.v][i].first, sta.dist+addedCost, temp});
                }
                else pq.push(State{graph[sta.v][i].first, sta.dist+addedCost, sta.path});
            }
        }
    }
    return State{-1, -1, vector<long long>{}};
}

void PathOut(State sta){
    freeEdges[sta.path[0]].second=sta.path[1];
    freeEdges[sta.path[sta.path.size()-1]].first=sta.path[sta.path.size()-2];
    for (long long i=1;i<sta.path.size()-1;i++){
        freeEdges[sta.path[i]].first=sta.path[i-1];
        freeEdges[sta.path[i]].second=sta.path[i+1];
    }
}

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    long long n, m, s, t, u, v;
    cin>>n>>m>>s>>t>>u>>v;
    graph.resize(n+7);
    found.resize(n+7);
    freeEdges.resize(n+7);
    for (long long i=0;i<m;i++){
        long long v1, v2, c;
        cin>>v1>>v2>>c;
        graph[v1].push_back({v2, c});
        graph[v2].push_back({v1, c});
    }
    PathOut(Dijkstra(s, t, true));
    long long dist=Dijkstra(u, v, false).dist;
    cout<<dist<<'\n';
    return 0;
}

Compilation message (stderr)

commuter_pass.cpp: In function 'State Dijkstra(long long int, long long int, bool)':
commuter_pass.cpp:21:25: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<bool>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   21 |     for (long long i=0;i<found.size();i++) found[i]=false;
      |                        ~^~~~~~~~~~~~~
commuter_pass.cpp:29:29: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   29 |         for (long long i=0;i<graph[sta.v].size();i++){
      |                            ~^~~~~~~~~~~~~~~~~~~~
commuter_pass.cpp: In function 'void PathOut(State)':
commuter_pass.cpp:48:25: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   48 |     for (long long i=1;i<sta.path.size()-1;i++){
      |                        ~^~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...