Submission #1275009

#TimeUsernameProblemLanguageResultExecution timeMemory
1275009hssaan_arifConstruction Project 2 (JOI24_ho_t2)C++20
45 / 100
8 ms840 KiB
// #include <me>
#include <bits/stdc++.h>
using namespace std;

#define endl "\n"
#define pb push_back
#define int long long
#define fi first
#define se second

const int N = 3e3 + 5, M = 1e9 + 7, LG = 20;

int n , m , S , T , L , K , ds[N] , u , v , w , dt[N];
vector<pair<int,int>> lis[N];

void get(int s , bool r){
    if (r){
        bool V[N] = {};
        set<pair<int,int>> st;
        for (int i = 1 ; i <= n ; i++){
            ds[i] = 1e18;
        }
        ds[s] = 0;
        V[s] = 1;
        int cn = 1;
        for (auto i : lis[s]){
            st.insert({i.fi , i.se});
        }
        while(cn != n && st.size()){
            int v = (*st.begin()).se , w = (*st.begin()).fi;
            st.erase((*st.begin()));
            if (V[v]) continue;
            cn++;
            // cout << u << ' ' << v << ' ' << w << endl;
            V[v] = 1;
            ds[v] = w;
            for (auto i : lis[v]){
                st.insert({i.fi + ds[v] , i.se});
            }
        }
    }else{
        bool V[N] = {};
        set<pair<int,int>> st;
        for (int i = 1 ; i <= n ; i++){
            dt[i] = 1e18;
        }
        dt[s] = 0;
        V[s] = 1;
        int cn = 1;
        for (auto i : lis[s]){
            st.insert({i.fi , i.se});
        }
        while(cn != n && st.size()){
            int v = (*st.begin()).se , w = (*st.begin()).fi;
            st.erase((*st.begin()));
            if (V[v]) continue;
            cn++;
            // cout << u << ' ' << v << ' ' << w << endl;
            V[v] = 1;
            dt[v] = w;
            for (auto i : lis[v]){
                st.insert({i.fi + dt[v] , i.se});
            }
        }
    }
    
}

void solve(){
    cin >> n >> m;
    cin >> S >> T >> L >> K;
    for (int i = 0 ; i < m ; i++){
        cin >> u >> v >> w;
        lis[u].pb({w , v});
        lis[v].pb({w , u});
    }
    get(S , 1);
    get(T , 0);
    if (ds[T] <= K){
        cout << (n * (n-1))/2 << endl;
        return;
    }
    int ans = 0 ;
    K -= L;
    for (int i = 1 ; i <= n ; i++){
        for (int j = i+1 ; j <= n ; j++){
            // cout << ds[i] << ' ' <<  dt[j] << ' ' << ds[j] << ' ' <<  dt[i] << endl;
            // int di = min({ds[i] + dt[j], dt[i] + ds[j]}) - K;
            int di = min(ds[i] , ds[j]) + min(dt[i] , dt[j]) - K;
            if (di <= 0) ans++;
        }
    }

    cout << ans << endl;
    

}

signed main(){
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int ts = 1;
    // cin >> ts;
    while(ts--){
        solve();
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...