제출 #228686

#제출 시각아이디문제언어결과실행 시간메모리
228686Ruxandra985Olympic Bus (JOI20_ho_t4)C++14
5 / 100
1097 ms226900 KiB
#include <bits/stdc++.h>
#define DIMN 210
#define INF 2000000000000000
using namespace std;
long long dp[DIMN][50010][2];


priority_queue <pair < pair <long long , long long > , pair <long long , long long > > > h;

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

struct idk{

    long long x , y , z , c;

} mch[50010];

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

        fscanf (fin,"%lld%lld%lld%lld",&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[i][j][0] = dp[i][j][1] = INF;

    for (j = 0 ; j <= m ; j++){
        dp[1][j][0] = 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[nod][taken][stare] != dist)
            continue;

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

        //printf ("%lld %lld %lld %lld\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[vecin][taken][1] > dist + cost){
                    dp[vecin][taken][1] = dist + cost;
                    h.push(make_pair(  make_pair( -dp[vecin][taken][1] , vecin ) , make_pair( 1 , taken )  ));
                }

            }
            else {
                if (dp[vecin][taken][stare] > dist + cost){
                    dp[vecin][taken][stare] = dist + cost;
                    h.push(make_pair(  make_pair( -dp[vecin][taken][stare] , 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[vecin][taken][1] > dist + cost){
                    dp[vecin][taken][1] = dist + cost;
                    h.push(make_pair(  make_pair( -dp[vecin][taken][1] , vecin ) , make_pair( 1 , taken )  ));
                }

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

        }



    }

    fprintf (fout,"-1");

    return 0;
}

컴파일 시 표준 에러 (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,"%lld%lld",&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,"%lld%lld%lld%lld",&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...