Submission #1149818

#TimeUsernameProblemLanguageResultExecution timeMemory
1149818murpylCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
188 ms30092 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long 
using ll = long long;
using vi = vector<int>;
#define pb push_back
#define rsz resize
#define all(x) begin(x), end(x)
#define sz(x) (int)(x).size()
using pi = pair<int,int>;
#define endl "\n"
#define mp make_pair
void setIO(string name = "") {
	ios_base::sync_with_stdio(0); cin.tie(0);
	if(sz(name)){
		freopen((name+".in").c_str(), "r", stdin); 
		freopen((name+".out").c_str(), "w", stdout);
	}
}


const int maxn = 1e5+10;
const int inf = 1e18;
vector<pi> adj[100010];
int n,m,s,t,u,v;
vi du(maxn), dv(maxn), dend(maxn);
int ans;
vector<bool> visited(maxn);
vector<vi> dp(maxn, vi(2, 0));

void dj1(int start, vi&arr){
    fill(arr.begin(), arr.end(), inf);

    priority_queue<pi, vector<pi>, greater<pi>> pq;
    pq.push({0, start});
    arr[start] = 0;
    while (!pq.empty()){
       // cout<<1<<endl;
        auto [c, node] = pq.top();
        pq.pop();
        if (c > arr[node]) continue;
        for (auto i : adj[node]){
            if (arr[i.first] > c + i.second){
                arr[i.first] = c + i.second;
                pq.push({arr[i.first], i.first});
            }
        }
    }
}


void dj2(int start, int end){
    dp.rsz(n+1, vi(2, inf));
    visited.rsz(n+1, false);
    priority_queue<pair<int, pi>, vector<pair<int, pi>>, greater<pair<int, pi>>> pq;
    pq.push({0, {start, 0}});
    dp[0][0] = dp[0][1] = inf;
    while (!pq.empty()){
        //cout<<2<<endl;
        auto [cost, node ] = pq.top();
        auto [cur, parent] = node;
        pq.pop();
        if (!visited[cur]){
            visited[cur] = true;
            dp[cur][0] = min(du[cur], dp[parent][0]);
            dp[cur][1] = min(dv[cur], dp[parent][1]);
            dend[cur] = cost;
            for (auto i : adj[cur]){
                pq.push({cost + i.second, {i.first, cur}});
            }
        }
        else if (cost == dend[cur]){
            if (min(du[cur], dp[parent][0]) + min(dv[cur], dp[parent][1]) <= dp[cur][0] + dp[cur][1]){
                dp[cur][0] = min(du[cur], dp[parent][0]);
                dp[cur][1] = min(dv[cur], dp[parent][1]);
            }
        }

    }
    ans = min(ans, dp[end][0] + dp[end][1]);
}


signed main(){
    setIO();
    cin>>n>>m>>s>>t>>u>>v;
    for (int i = 0; i < m; i++){
        int a,b,c;
        cin>>a>>b>>c;
        adj[a].pb({b,c});
        adj[b].pb({a,c});
    }
    du.rsz(n+1);
    dv.rsz(n+1);

    dj1(u, du);
    dj1(v, dv);
    ans = du[v]; 
    dj2(s,t);
    dj2(t,s);
    cout<<ans<<endl;

}

Compilation message (stderr)

commuter_pass.cpp: In function 'void setIO(std::string)':
commuter_pass.cpp:16:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   16 |                 freopen((name+".in").c_str(), "r", stdin);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
commuter_pass.cpp:17:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   17 |                 freopen((name+".out").c_str(), "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...