Submission #228715

#TimeUsernameProblemLanguageResultExecution timeMemory
228715Ruxandra985Olympic Bus (JOI20_ho_t4)C++14
5 / 100
1103 ms147352 KiB
#include <bits/stdc++.h>
#define DIMN 210
#define INF 2000000000
using namespace std;
int dp[2][DIMN][50010];


priority_queue <pair < pair <int , int > , pair <int , int > > > h;

vector <pair <int , pair <int , int > > > v[DIMN];

struct idk{

    int x , y , z , c;

} mch[50010];

int main()
{
    FILE *fin = stdin;
    FILE *fout = stdout;
    int n , m , x , y , z , c , i , dist , nod , vecin , cost , stare , j , taken;
    fscanf (fin,"%d%d",&n,&m);
    for (i = 1 ; i <= m ; i++){

        fscanf (fin,"%d%d%d%d",&x,&y,&z,&c);
        v[x].push_back(make_pair(y , make_pair(z , i)));
        mch[i] = {x , y , z , c};
    }

    /// acum faci cele 2 dijkstra uri
    for (i = 1 ; i <= n ; i++)
        for (j = 0 ; j <= m ; j++)
            dp[0][i][j] = dp[1][i][j] = INF;

    for (j = 0 ; j <= m ; j++){
        dp[0][1][j] = mch[j].c;
        h.push(make_pair(make_pair(-mch[j].c , 1) , make_pair(0 , j)));
    }


    while (!h.empty()){

        dist = -h.top().first.first;
        nod = h.top().first.second;
        stare = h.top().second.first;
        taken = h.top().second.second;
        h.pop();

        if (dp[stare][nod][taken] != dist)
            continue;

        if (nod == 1 && stare == 1){
            fprintf (fout,"%d",dist);
            return 0;
        }

        //printf ("%d %d %d %d\n" , nod , stare , taken , dist);


        if (nod == mch[taken].y){ /// caz particular, parcurg muchia intoarsa

            /// parcurgi muchia inversa
            vecin = mch[taken].x;
            cost = mch[taken].z;

            if (vecin == n && stare == 0){

                /// cazul cand se schimba starea

                if (dp[1][vecin][taken] > dist + cost){
                    dp[1][vecin][taken] = dist + cost;
                    h.push(make_pair(  make_pair( -dp[1][vecin][taken] , vecin ) , make_pair( 1 , taken )  ));
                }

            }
            else {
                if (dp[stare][vecin][taken] > dist + cost){
                    dp[stare][vecin][taken] = dist + cost;
                    h.push(make_pair(  make_pair( -dp[stare][vecin][taken] , vecin ) , make_pair( stare , taken )  ));
                }
            }


        }


        for (i = 0 ; i < v[nod].size() ; i++){

            vecin = v[nod][i].first;
            cost = v[nod][i].second.first;

            if (v[nod][i].second.second == taken)
                continue;

            if (vecin == n && stare == 0){

                /// cazul cand se schimba starea

                if (dp[1][vecin][taken] > dist + cost){
                    dp[1][vecin][taken] = dist + cost;
                    h.push(make_pair(  make_pair( -dp[1][vecin][taken] , vecin ) , make_pair( 1 , taken )  ));
                }

            }
            else {
                if (dp[stare][vecin][taken] > dist + cost){
                    dp[stare][vecin][taken] = dist + cost;
                    h.push(make_pair(  make_pair( -dp[stare][vecin][taken] , vecin ) , make_pair( stare , taken )  ));
                }
            }

        }



    }

    fprintf (fout,"-1");

    return 0;
}

Compilation message (stderr)

ho_t4.cpp: In function 'int main()':
ho_t4.cpp:88:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for (i = 0 ; i < v[nod].size() ; i++){
                      ~~^~~~~~~~~~~~~~~
ho_t4.cpp:23:12: warning: ignoring return value of 'int fscanf(FILE*, const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     fscanf (fin,"%d%d",&n,&m);
     ~~~~~~~^~~~~~~~~~~~~~~~~~
ho_t4.cpp:26:16: warning: ignoring return value of 'int fscanf(FILE*, const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         fscanf (fin,"%d%d%d%d",&x,&y,&z,&c);
         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...