제출 #223853

#제출 시각아이디문제언어결과실행 시간메모리
223853Ruxandra985Commuter Pass (JOI18_commuter_pass)C++14
100 / 100
821 ms31952 KiB
#include <bits/stdc++.h>
#define INF 200000000000000LL
#define DIMN 100010
using namespace std;

long long d[DIMN] , ds[DIMN] , dt[DIMN];
long long dp[3][DIMN];
vector <pair <int,long long> > v[DIMN] , w[DIMN];
priority_queue <pair <long long,int> > h;

priority_queue <pair <long long , pair <int,int> > > hp;

struct idk{
    int x , y;
    long long z;
} mch[2*DIMN];

int n;

void dijkstra (int s , long long d[]){
    int i , nod , vecin;
    long long cost , c;

    for (i = 1 ; i <= n ; i++)
        d[i] = INF;

    d[s] = 0;
    h.push(make_pair( 0 , s ));
    while (!h.empty()){
        nod = h.top().second;
        cost = -h.top().first;

        h.pop();
        if (d[nod] != cost)
            continue;


        for (i = 0 ; i < v[nod].size() ; i++){
            vecin = v[nod][i].first;
            c = v[nod][i].second;
            if (d[vecin] > d[nod] + c){
                d[vecin] = d[nod] + c;
                h.push(make_pair(-d[vecin] , vecin));
            }
        }

    }



}
int main()
{
    FILE *fin = stdin;
    FILE *fout = stdout;
    int i , m , s , t , u , vv , nod , vecin , x , y , z , stare , idk;
    long long c , cost;
    fscanf (fin,"%d%d%d%d%d%d",&n,&m,&s,&t,&u,&vv);

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

    /// un dijkstra din s

    dijkstra (s , ds);

    /// un dijkstra din t

    dijkstra (t , dt);

    /// inca un dijkstra dar pe w intre u si v

    for (i = 1 ; i <= n ; i++)
        dp[0][i] = dp[1][i] = dp[2][i] = INF;

    if (ds[u] + dt[u] == ds[t]){
        dp[1][u] = 0;
        hp.push(make_pair( 0 , make_pair(1 , u) ));
        hp.push(make_pair( 0 , make_pair(-1 , u) ));
    }
    dp[0][u] = 0;
    hp.push(make_pair( 0 , make_pair(0 , u) ));
    while (!hp.empty()){
        nod = hp.top().second.second;
        stare = hp.top().second.first;
        cost = -hp.top().first;

        idk = 0;

        if (stare < 0){
            idk = 1;
            stare = -stare;
        }

        hp.pop();

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


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

            if (stare == 0){

                if (ds[vecin] + dt[vecin] == ds[t]){ /// schimba starea
                    if (dp[1][vecin] > dp[0][nod] + c){
                        dp[1][vecin] = dp[0][nod] + c;
                        hp.push(make_pair( -dp[1][vecin] , make_pair(1 , vecin) ));
                        hp.push(make_pair( -dp[1][vecin] , make_pair(-1 , vecin) ));
                    }
                }

                if (dp[0][vecin] > dp[0][nod] + c){
                    dp[0][vecin] = dp[0][nod] + c;
                    hp.push(make_pair( -dp[0][vecin] , make_pair(0 , vecin) ));
                }


            }
            else if (stare == 1){

                if ((idk == 0 && ds[nod] + dt[vecin] + c == ds[t]) || (idk == 1 && ds[vecin] + dt[nod] + c == ds[t])){
                    if (dp[1][vecin] > dp[1][nod]){ /// pastrezi starea 1
                        dp[1][vecin] = dp[1][nod];
                        if (!idk)
                            hp.push(make_pair( -dp[1][vecin] , make_pair(1 , vecin) ));
                        else hp.push(make_pair( -dp[1][vecin] , make_pair(-1 , vecin) ));
                    }
                }
                if (dp[2][vecin] > dp[1][nod] + c){ /// schimbi starea
                    dp[2][vecin] = dp[1][nod] + c;
                    hp.push(make_pair( -dp[2][vecin] , make_pair(2 , vecin) ));
                }

            }
            else {
                if (dp[2][vecin] > dp[2][nod] + c){ /// pastrezi starea 2
                    dp[2][vecin] = dp[2][nod] + c;
                    hp.push(make_pair( -dp[2][vecin] , make_pair(2 , vecin) ));
                }
            }
        }

    }

    long long sol = min(dp[0][vv] , min(dp[1][vv] , dp[2][vv]));

    for (i = 1 ; i <= n ; i++)
        dp[0][i] = dp[1][i] = dp[2][i] = INF;

    if (ds[vv] + dt[vv] == ds[t]){
        dp[1][vv] = 0;
        hp.push(make_pair( 0 , make_pair(1 , vv) ));
        hp.push(make_pair( 0 , make_pair(-1 , vv) ));
    }
    dp[0][vv] = 0;
    hp.push(make_pair( 0 , make_pair(0 , vv) ));
    while (!hp.empty()){
        nod = hp.top().second.second;
        stare = hp.top().second.first;
        cost = -hp.top().first;

        idk = 0;

        if (stare < 0){
            idk = 1;
            stare = -stare;
        }

        hp.pop();

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


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

            if (stare == 0){

                if (ds[vecin] + dt[vecin] == ds[t]){ /// schimba starea
                    if (dp[1][vecin] > dp[0][nod] + c){
                        dp[1][vecin] = dp[0][nod] + c;
                        hp.push(make_pair( -dp[1][vecin] , make_pair(1 , vecin) ));
                        hp.push(make_pair( -dp[1][vecin] , make_pair(-1 , vecin) ));
                    }
                }

                if (dp[0][vecin] > dp[0][nod] + c){
                    dp[0][vecin] = dp[0][nod] + c;
                    hp.push(make_pair( -dp[0][vecin] , make_pair(0 , vecin) ));
                }


            }
            else if (stare == 1){

                if ((idk == 0 && ds[nod] + dt[vecin] + c == ds[t]) || (idk == 1 && ds[vecin] + dt[nod] + c == ds[t])){
                    if (dp[1][vecin] > dp[1][nod]){ /// pastrezi starea 1
                        dp[1][vecin] = dp[1][nod];
                        if (!idk)
                            hp.push(make_pair( -dp[1][vecin] , make_pair(1 , vecin) ));
                        else hp.push(make_pair( -dp[1][vecin] , make_pair(-1 , vecin) ));
                    }
                }
                if (dp[2][vecin] > dp[1][nod] + c){ /// schimbi starea
                    dp[2][vecin] = dp[1][nod] + c;
                    hp.push(make_pair( -dp[2][vecin] , make_pair(2 , vecin) ));
                }

            }
            else {
                if (dp[2][vecin] > dp[2][nod] + c){ /// pastrezi starea 2
                    dp[2][vecin] = dp[2][nod] + c;
                    hp.push(make_pair( -dp[2][vecin] , make_pair(2 , vecin) ));
                }
            }
        }

    }
    sol = min(sol , min(dp[0][u] , min(dp[1][u] , dp[2][u])));
    fprintf (fout,"%lld",sol);

    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

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