Submission #77183

# Submission time Handle Problem Language Result Execution time Memory
77183 2018-09-23T16:21:53 Z Vardanyan Commuter Pass (JOI18_commuter_pass) C++14
31 / 100
577 ms 61068 KB
#include <bits/stdc++.h>
using namespace std;
const int N = 200*1000+7;
const long long INF = 100000000000000005;
vector<pair<int,long long> > g[N];
long long dist[N];
long long ans = INF;
int n,m;
int s,t;
int U,V;
long long distu[N],distv[N];
long long dp1[N],dp2[N];
long long distt[N];
bool c[N];
int main(){
    scanf("%d%d",&n,&m);
    scanf("%d%d",&s,&t);
    scanf("%d%d",&U,&V);
    for(int i = 0;i<m;i++){
        int x,y;
        long long z;
        scanf("%d%d%lld",&x,&y,&z);
        g[x].push_back({y,z});
        g[y].push_back({x,z});
    }
    priority_queue<pair<long long,int> > pq;
    pq.push({0,s});
    for(int i = 0;i<=n;i++) dist[i] = INF;
    dist[s] = 0;
    while(!pq.empty()){
        pair<long long,int> gag = pq.top();
        pq.pop();
        for(int i = 0;i<g[gag.second].size();i++){
            int to = g[gag.second][i].first;
            if(dist[to]>(-gag.first)+g[gag.second][i].second){
                dist[to] = (-gag.first)+g[gag.second][i].second;
                pq.push({-dist[to],to});
            }
        }
    }
    pq.push({0,t});
    for(int i = 0;i<=n;i++) distt[i] = INF;
    distt[t] = 0;
    while(!pq.empty()){
        pair<long long,int> gag = pq.top();
        pq.pop();
        for(int i = 0;i<g[gag.second].size();i++){
            int to = g[gag.second][i].first;
            if(distt[to]>(-gag.first)+g[gag.second][i].second){
                distt[to] = (-gag.first)+g[gag.second][i].second;
                pq.push({-distt[to],to});
            }
        }
    }
   // dfs(s);
  //  if(all.size() == 0) assert(0);
    pq.push({0,U});
    for(int i = 0;i<=n;i++) distu[i] = INF;
    distu[U] = 0;
    while(!pq.empty()){
        pair<long long,int> gag = pq.top();
        pq.pop();
        for(int i = 0;i<g[gag.second].size();i++){
            int to = g[gag.second][i].first;
            if(distu[to]>(-gag.first)+g[gag.second][i].second){
                distu[to] = (-gag.first)+g[gag.second][i].second;
                pq.push({-distu[to],to});
            }
        }
    }
    pq.push({0,V});
    for(int i = 0;i<=n;i++) distv[i] = INF;
    distv[V] = 0;
    while(!pq.empty()){
        pair<long long,int> gag = pq.top();
        pq.pop();
        for(int i = 0;i<g[gag.second].size();i++){
            int to = g[gag.second][i].first;
            if(distv[to]>(-gag.first)+g[gag.second][i].second){
                distv[to] = (-gag.first)+g[gag.second][i].second;
                pq.push({-distv[to],to});
            }
        }
    }
    for(int i = 0;i<=n;i++) dp1[i] = INF;
    dp1[s] = distv[s];
    c[s] = 1;
   // cout<<dp1[s]<<endl;
    pq.push({-dp1[s],s});
    while(!pq.empty()){
        pair<long long,int> gag = pq.top();
        pq.pop();
        for(int i = 0;i<g[gag.second].size();i++){
            int to = g[gag.second][i].first;
            if(!c[to] && dp1[to]>min(-gag.first,distv[to]) && dist[t] == dist[to]+distt[to]){
                dp1[to] = min(-gag.first,distv[to]);
                pq.push({-dp1[to],to});
            }
        }
    }
    for(int i = 0;i<=n;i++) dp2[i] = INF;
    memset(c,0,sizeof(c));
    dp2[t] = distv[t];
    c[t] = 1;
    pq.push({-dp2[t],t});
    while(!pq.empty()){
        pair<long long,int> gag = pq.top();
        pq.pop();
        for(int i = 0;i<g[gag.second].size();i++){
            int to = g[gag.second][i].first;
            if(!c[to] && dp2[to]>min(-gag.first,distv[to]) && dist[t] == dist[to]+distt[to]){
                dp2[to] = min(-gag.first,distv[to]);
                pq.push({-dp2[to],to});
            }
        }
    }
    ans = min(distu[V],distv[U]);
    for(int i = 1;i<=n;i++){
        if(dist[t] == dist[i]+distt[i]){
     //       cout<<i<<" "<<distu[i]<<" "<<dp1[i]<<" "<<dp2[i]<<endl;
            ans = min(ans,distu[i]+min(dp1[i],dp2[i]));
        }
    }
    /*for(int i = 0;i<all.size();i++){
        long long mn = INF;
        long long mnn = INF;
        for(int j = 0;j<all[i].size();j++){
            mn = min(mn,distu[all[i][j]]);
            mnn = min(mnn,distv[all[i][j]]);
        }
        if(mn<INF && mnn<INF)
        ans = min(ans,mn+mnn);
    }*/

    cout<<ans<<endl;

    /*for(int i = 1;i<=n;i++){
        cout<<i<<" "<<dist[i]<<endl;
    }*/
    return 0;
}

Compilation message

commuter_pass.cpp: In function 'int main()':
commuter_pass.cpp:33:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int i = 0;i<g[gag.second].size();i++){
                       ~^~~~~~~~~~~~~~~~~~~~~
commuter_pass.cpp:47:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int i = 0;i<g[gag.second].size();i++){
                       ~^~~~~~~~~~~~~~~~~~~~~
commuter_pass.cpp:63:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int i = 0;i<g[gag.second].size();i++){
                       ~^~~~~~~~~~~~~~~~~~~~~
commuter_pass.cpp:77:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int i = 0;i<g[gag.second].size();i++){
                       ~^~~~~~~~~~~~~~~~~~~~~
commuter_pass.cpp:93:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int i = 0;i<g[gag.second].size();i++){
                       ~^~~~~~~~~~~~~~~~~~~~~
commuter_pass.cpp:109:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int i = 0;i<g[gag.second].size();i++){
                       ~^~~~~~~~~~~~~~~~~~~~~
commuter_pass.cpp:16:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d%d",&n,&m);
     ~~~~~^~~~~~~~~~~~~~
commuter_pass.cpp:17:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d%d",&s,&t);
     ~~~~~^~~~~~~~~~~~~~
commuter_pass.cpp:18:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d%d",&U,&V);
     ~~~~~^~~~~~~~~~~~~~
commuter_pass.cpp:22:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d%d%lld",&x,&y,&z);
         ~~~~~^~~~~~~~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 413 ms 21480 KB Output is correct
2 Correct 454 ms 24940 KB Output is correct
3 Correct 561 ms 27712 KB Output is correct
4 Correct 454 ms 31636 KB Output is correct
5 Correct 474 ms 34700 KB Output is correct
6 Correct 451 ms 39000 KB Output is correct
7 Correct 536 ms 42364 KB Output is correct
8 Correct 513 ms 45612 KB Output is correct
9 Correct 441 ms 49980 KB Output is correct
10 Correct 373 ms 54228 KB Output is correct
11 Correct 262 ms 54228 KB Output is correct
12 Correct 490 ms 60692 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 489 ms 61068 KB Output is correct
2 Correct 536 ms 61068 KB Output is correct
3 Correct 577 ms 61068 KB Output is correct
4 Correct 515 ms 61068 KB Output is correct
5 Correct 543 ms 61068 KB Output is correct
6 Correct 543 ms 61068 KB Output is correct
7 Correct 533 ms 61068 KB Output is correct
8 Correct 513 ms 61068 KB Output is correct
9 Correct 514 ms 61068 KB Output is correct
10 Correct 539 ms 61068 KB Output is correct
11 Correct 261 ms 61068 KB Output is correct
12 Correct 567 ms 61068 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 19 ms 61068 KB Output is correct
2 Correct 8 ms 61068 KB Output is correct
3 Incorrect 7 ms 61068 KB Output isn't correct
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 413 ms 21480 KB Output is correct
2 Correct 454 ms 24940 KB Output is correct
3 Correct 561 ms 27712 KB Output is correct
4 Correct 454 ms 31636 KB Output is correct
5 Correct 474 ms 34700 KB Output is correct
6 Correct 451 ms 39000 KB Output is correct
7 Correct 536 ms 42364 KB Output is correct
8 Correct 513 ms 45612 KB Output is correct
9 Correct 441 ms 49980 KB Output is correct
10 Correct 373 ms 54228 KB Output is correct
11 Correct 262 ms 54228 KB Output is correct
12 Correct 490 ms 60692 KB Output is correct
13 Correct 489 ms 61068 KB Output is correct
14 Correct 536 ms 61068 KB Output is correct
15 Correct 577 ms 61068 KB Output is correct
16 Correct 515 ms 61068 KB Output is correct
17 Correct 543 ms 61068 KB Output is correct
18 Correct 543 ms 61068 KB Output is correct
19 Correct 533 ms 61068 KB Output is correct
20 Correct 513 ms 61068 KB Output is correct
21 Correct 514 ms 61068 KB Output is correct
22 Correct 539 ms 61068 KB Output is correct
23 Correct 261 ms 61068 KB Output is correct
24 Correct 567 ms 61068 KB Output is correct
25 Correct 19 ms 61068 KB Output is correct
26 Correct 8 ms 61068 KB Output is correct
27 Incorrect 7 ms 61068 KB Output isn't correct
28 Halted 0 ms 0 KB -