Submission #1235869

#TimeUsernameProblemLanguageResultExecution timeMemory
1235869inesfiMuseum (CEOI17_museum)C++20
0 / 100
3092 ms320 KiB
#include<bits/stdc++.h>
using namespace std;

//#define int long long
#define endl "\n"

struct route {
    int deb,fin,vitesse,longueur;
};

struct pos {
    double temps;
    int num_ville,vitesse_avant;
    int ville_avant,vitesse_encore_avant;

    bool operator<(const pos& autre) const {
        return temps<autre.temps;
    }
};

const int VILLEMAXI=152,VITESSEMAXI=502;
vector<int> adja[VILLEMAXI];
vector<route> routes;
set<pos> encours;
double dist[VILLEMAXI][VITESSEMAXI];
pair<int,int> avant[VILLEMAXI][VITESSEMAXI]; // ville,vitesse

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int nbvilles,nbroutes,destination;
    cin>>nbvilles>>nbroutes>>destination;
    for (int i=0;i<nbroutes;i++){
        route r;
        cin>>r.deb>>r.fin>>r.vitesse>>r.longueur;
        routes.push_back(r);
        adja[r.deb].push_back(i);
    }
    for (int i=0;i<nbvilles;i++){
        for (int j=0;j<VITESSEMAXI;j++){
            dist[i][j]=-1;
        }
    }
    encours.insert({0,0,70,-1,-1});
    //int compt=0;
    bool ok=false;
    int vitessefin=0;
    while (ok==false){
        //compt++;
        pos ec=*encours.begin();
        encours.erase(encours.begin());
        if (ec.num_ville==destination){
            dist[ec.num_ville][ec.vitesse_avant]=ec.temps;
            vitessefin=ec.vitesse_avant;
            avant[ec.num_ville][ec.vitesse_avant]={ec.ville_avant,ec.vitesse_encore_avant};
            ok=true;
        }
        else {
            if (dist[ec.num_ville][ec.vitesse_avant]==-1){
                dist[ec.num_ville][ec.vitesse_avant]=ec.temps;
                avant[ec.num_ville][ec.vitesse_avant]={ec.ville_avant,ec.vitesse_encore_avant};
                for (auto v:adja[ec.num_ville]){
                    int nouv_vitesse=ec.vitesse_avant;
                    if (routes[v].vitesse!=0){
                        nouv_vitesse=routes[v].vitesse;
                    }
                    pos nouv;
                    nouv.temps=ec.temps+(double)routes[v].longueur/(double)nouv_vitesse;
                    nouv.num_ville=routes[v].fin;
                    nouv.vitesse_avant=nouv_vitesse;
                    nouv.ville_avant=ec.num_ville;
                    nouv.vitesse_encore_avant=ec.vitesse_avant;
                    if (dist[nouv.num_ville][nouv.vitesse_avant]==-1){
                        encours.insert(nouv);
                    }
                }
            }
        }
    }
    //cout<<42<<endl;
    //return 0;
    vector<int> rep={};
    int ville_ec=destination,vitesse_ec=vitessefin;
    while (ville_ec!=0){
        rep.push_back(ville_ec);
        int nvil=avant[ville_ec][vitesse_ec].first;
        int nvit=avant[ville_ec][vitesse_ec].second;
        ville_ec=nvil;
        vitesse_ec=nvit;
    }
    rep.push_back(0);
    reverse(rep.begin(),rep.end());
    for (auto r:rep){
        cout<<r<<" ";
    }
    cout<<endl;
    //cout<<dist[destination][vitessefin]<<endl;
    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...