250962026-02-17 21:38:47KevinBarátnők (50 pont)cpp17Accepted 50/50120ms9888 KiB
#include <bits/stdc++.h>
using namespace std;

static const long long MOD = 1000000007LL;
static const long long INF = LLONG_MAX;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int N, M;
    cin >> N >> M;

    vector<vector<pair<int,long long>>> graph(N+1);

    for(int i = 0; i < M; i++) {
        int u, v;
        long long w;
        cin >> u >> v >> w;
        graph[u].push_back({v, w});
        graph[v].push_back({u, w});
    }

    int A, B;
    cin >> A >> B;

    auto dijkstra = [&](int start,
                        vector<long long>& dist,
                        vector<long long>& ways) {
        dist.assign(N+1, INF);
        ways.assign(N+1, 0);

        priority_queue<
            pair<long long,int>,
            vector<pair<long long,int>>,
            greater<pair<long long,int>>
        > pq;

        dist[start] = 0;
        ways[start] = 1;
        pq.push({0, start});

        while(!pq.empty()) {
            auto [cd, u] = pq.top();
            pq.pop();
            if(cd > dist[u]) continue;

            for(auto [v, w] : graph[u]) {
                long long nd = cd + w;
                if(nd < dist[v]) {
                    dist[v] = nd;
                    ways[v] = ways[u];
                    pq.push({nd, v});
                } else if(nd == dist[v]) {
                    ways[v] = (ways[v] + ways[u]) % MOD;
                }
            }
        }
    };

    vector<long long> distA, distB;
    vector<long long> waysA, waysB;

    dijkstra(A, distA, waysA);
    dijkstra(B, distB, waysB);

    long long D = distA[B];
    long long total = (waysA[B] * waysA[B]) % MOD;

    long long bad = 0;

    // ---- Csúcson történő találkozás ----
    for(int v = 1; v <= N; v++) {
        if(distA[v] + distB[v] == D && distA[v] * 2 == D) {
            long long cnt = (waysA[v] * waysB[v]) % MOD;
            bad = (bad + cnt * cnt) % MOD;
        }
    }

    // ---- Élen történő találkozás ----
    for(int u = 1; u <= N; u++) {
        for(auto [v, w] : graph[u]) {

            // irányítottként egyszer számoljuk
            if(distA[u] < distA[v]) {
                if(distA[u] + w + distB[v] == D) {

                    if(distA[u] * 2 < D &&
                       distA[v] * 2 > D) {

                        long long cnt =
                          (waysA[u] * waysB[v]) % MOD;

                        bad = (bad + cnt * cnt) % MOD;
                    }
                }
            }
        }
    }

    long long ans = (total - bad) % MOD;
    if(ans < 0) ans += MOD;

    cout << ans << "\n";

    return 0;
}
SubtaskSumTestVerdictTimeMemory
base50/50
1Accepted0/01ms316 KiB
2Accepted0/0107ms9392 KiB
3Accepted2/22ms316 KiB
4Accepted2/22ms316 KiB
5Accepted2/21ms384 KiB
6Accepted2/22ms316 KiB
7Accepted2/22ms316 KiB
8Accepted1/150ms5820 KiB
9Accepted2/286ms8820 KiB
10Accepted2/2101ms8752 KiB
11Accepted2/285ms8752 KiB
12Accepted2/297ms8640 KiB
13Accepted2/2100ms8756 KiB
14Accepted2/281ms8632 KiB
15Accepted2/279ms8504 KiB
16Accepted1/1116ms9376 KiB
17Accepted1/1105ms9388 KiB
18Accepted1/150ms5684 KiB
19Accepted2/2107ms9564 KiB
20Accepted2/2108ms8880 KiB
21Accepted2/2112ms9308 KiB
22Accepted2/2101ms9560 KiB
23Accepted2/2120ms9812 KiB
24Accepted2/290ms9888 KiB
25Accepted2/275ms8848 KiB
26Accepted2/297ms9160 KiB
27Accepted2/2116ms9384 KiB
28Accepted2/2119ms9788 KiB
29Accepted2/293ms9360 KiB