제출 #223795

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

long long d[DIMN] , ds[DIMN] , dt[DIMN];
vector <pair <int,long long> > v[DIMN] , w[DIMN];
priority_queue <pair <long long,int> > h;
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;
    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);

    for (i = 1 ; i <= m ; i++){
        x = mch[i].x;
        y = mch[i].y;
        z = mch[i].z;

        /// poate muchia x y sa fie pe drum?

        if (ds[x] + dt[y] + z == ds[t] || ds[y] + dt[x] + z == ds[t]){
            w[x].push_back(make_pair(y , 0));
            w[y].push_back(make_pair(x , 0));
            /// poate
        }
        else {
            w[x].push_back(make_pair(y , z));
            w[y].push_back(make_pair(x , z));
            /// nu poate
        }

    }

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

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

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


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

    }

    fprintf (fout,"%lld",d[vv]);

    return 0;
}

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

commuter_pass.cpp: In function 'void dijkstra(int, long long int*)':
commuter_pass.cpp:34: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:106:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for (i = 0 ; i < w[nod].size() ; i++){
                      ~~^~~~~~~~~~~~~~~
commuter_pass.cpp:54: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:57: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...