251732026-02-18 10:58:52KevinBarátnők (50 pont)cpp17Időlimit túllépés 4/501.1s9376 KiB
#include <bits/stdc++.h>
#include <climits>
#include <queue>
using namespace std;
using ll=long long;
using pll=pair<ll, ll>;
const ll MOD=1e9+7;
const ll INF=LONG_LONG_MAX;

int main() {
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    ll n, m; cin >> n >> m;
    vector<vector<pll>> graph(n, vector<pll> ());
    for (ll i=0; i<m; i++){
        ll a, b, c; cin >> a >> b >> c; a--; b--;
        graph[a].push_back({b, c});
        graph[b].push_back({a, c});
    }
    ll a, b; cin >> a >> b; a--; b--;
    vector<ll> disA(n, INF);
    vector<ll> disB(n, INF);
    vector<ll> waysA(n, 0);
    vector<ll> waysB(n, 0);
    priority_queue<pll> pq;
    disA[a]=0;
    waysA[a]=1;
    pq.push({0, a});
    while (pq.size()>0){
        ll disCurr=pq.top().first, idParent=pq.top().second;
        pq.pop();
        for (auto& [idChild, road]:graph[idParent]){
            if (disA[idChild]==disCurr+road)
                waysA[idChild]+=waysA[idParent];
            if (disA[idChild]>disCurr+road){
                disA[idChild]=disCurr+road;
                waysA[idChild]=waysA[idParent];
                pq.push({disA[idChild], idChild});
            }
        }
    }
    disB[b]=0;
    waysB[b]=1;
    pq.push({0, b});
    while (pq.size()>0){
        ll disCurr=pq.top().first, idParent=pq.top().second;
        pq.pop();
        for (auto& [idChild, road]:graph[idParent]){
            if (disB[idChild]==disCurr+road)
                waysB[idChild]+=waysB[idParent];
            if (disB[idChild]>disCurr+road){
                disB[idChild]=disCurr+road;
                waysB[idChild]=waysB[idParent];
                pq.push({disB[idChild], idChild});
            }
        }
    }
    ll total=waysA[b]*waysA[b]%MOD;
    ll bad=0;
    for (ll i=0; i<n; i++){
        if (disA[i]*2==disA[b] && disA[i]==disB[i]){
            bad+=waysA[i]*waysB[i]%MOD*waysA[i]*waysB[i]%MOD;
            bad%=MOD;
        }
    }
    for (ll i=0; i<n; i++){
        for (auto& [id, road]:graph[i]){
            if (disA[i]+road==disA[id] && disA[id]+disB[id]==disA[b] && disA[i]*2<disA[b] && disB[id]*2<disA[b]){
                bad+=waysA[i]*waysB[id]%MOD*waysA[i]*waysB[id]%MOD;
                bad%=MOD;
            }
        }
    }
    cout << (total-bad+MOD)%MOD;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
base4/50
1Elfogadva0/01ms316 KiB
2Időlimit túllépés0/01.08s8880 KiB
3Hibás válasz0/27ms316 KiB
4Hibás válasz0/210ms512 KiB
5Hibás válasz0/23ms316 KiB
6Hibás válasz0/23ms316 KiB
7Hibás válasz0/24ms316 KiB
8Elfogadva1/150ms5684 KiB
9Elfogadva2/290ms9120 KiB
10Időlimit túllépés0/21.1s8840 KiB
11Időlimit túllépés0/21.085s8760 KiB
12Hibás válasz0/2114ms9376 KiB
13Időlimit túllépés0/21.078s8880 KiB
14Időlimit túllépés0/21.09s8880 KiB
15Időlimit túllépés0/21.08s8888 KiB
16Időlimit túllépés0/11.08s8732 KiB
17Időlimit túllépés0/11.083s8668 KiB
18Elfogadva1/146ms5684 KiB
19Időlimit túllépés0/21.088s8888 KiB
20Időlimit túllépés0/21.1s8624 KiB
21Időlimit túllépés0/21.085s8880 KiB
22Időlimit túllépés0/21.087s8372 KiB
23Időlimit túllépés0/21.093s8884 KiB
24Időlimit túllépés0/21.1s7444 KiB
25Időlimit túllépés0/21.088s7220 KiB
26Időlimit túllépés0/21.09s8372 KiB
27Időlimit túllépés0/21.078s8928 KiB
28Időlimit túllépés0/21.1s8784 KiB
29Időlimit túllépés0/21.09s8368 KiB