Submission #114984

#TimeUsernameProblemLanguageResultExecution timeMemory
114984MercenaryCommuter Pass (JOI18_commuter_pass)C++14
100 / 100
538 ms23504 KiB
#include<bits/stdc++.h>

using namespace std;
#define taskname "A"
#define pb	push_back
#define mp 	make_pair
#ifndef LOCAL
#define cerr if(0)cout
#endif

typedef long double ld;
typedef long long ll;
typedef pair<int,int> ii;
typedef pair<ll,int> lli;

const int maxn = 1e5 + 5;
const ll inf = (ll)1e18;

ll d[4][maxn];
vector<ii> adj[maxn];

void dij(int start , ll d[]){
    priority_queue<lli,vector<lli>,greater<lli>> pq;
    fill_n(d , maxn , inf);
    pq.push(mp(0ll,start));
    d[start] = 0;
    while(!pq.empty()){
        auto u = pq.top();pq.pop();
        if(d[u.second] != u.first)continue;
        for(ii c : adj[u.second]){
            if(d[c.first] > u.first + c.second){
                d[c.first] = u.first + c.second;
                pq.push(mp(d[c.first],c.first));
            }
        }
    }
}

ll dp[maxn][3];
int n , m , s , t , u , v;

void DFS(int u){
//    cout << u << endl;
    if(dp[u][0] != inf)return;
    cerr << u << " ";
    dp[u][0] = min(dp[u][0] , d[0][u]);
    dp[u][1] = min(dp[u][1] , d[1][u]);
    dp[u][2] = d[0][u] + d[1][u];
    for(ii c : adj[u]){
        if(d[2][u] + c.second + d[3][c.first] == d[2][t]){
            DFS(c.first);
            dp[u][2] = min(dp[u][2] , min(dp[u][0],dp[c.first][0]) + dp[u][1]);
            dp[u][2] = min(dp[u][2] , dp[u][0] + min(dp[u][1],dp[c.first][1]));
            dp[u][2] = min(dp[u][2] , dp[c.first][2]);
        }
    }
    for(ii c : adj[u]){
        if(d[2][u] + c.second + d[3][c.first] == d[2][t]){
            dp[u][0] = min(dp[u][0],dp[c.first][0]);
            dp[u][1] = min(dp[u][1],dp[c.first][1]);
        }
    }
}

void enter(){
    cin >> n >> m;
    cin >> s >> t >> u >> v;
    for(int i = 1 ; i <= m ; ++i){
        int u , v , c;cin >> u >> v >> c;
        adj[u].pb(mp(v,c));
        adj[v].pb(mp(u,c));
    }
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    if(fopen(taskname".INP","r")){
		freopen(taskname".INP", "r",stdin);
		freopen(taskname".OUT", "w",stdout);
    }
    enter();
    dij(u , d[0]);
    dij(v , d[1]);
    dij(s , d[2]);
    dij(t , d[3]);
    fill_n(&dp[0][0],maxn*3,inf);
    DFS(s);
    cout << min(dp[s][2],d[0][v]);
}

Compilation message (stderr)

commuter_pass.cpp: In function 'int main()':
commuter_pass.cpp:80:10: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
   freopen(taskname".INP", "r",stdin);
   ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
commuter_pass.cpp:81:10: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
   freopen(taskname".OUT", "w",stdout);
   ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...