250962026-02-17 21:38:47KevinBarátnők (50 pont)cpp17Elfogadva 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;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
base50/50
1Elfogadva0/01ms316 KiB
2Elfogadva0/0107ms9392 KiB
3Elfogadva2/22ms316 KiB
4Elfogadva2/22ms316 KiB
5Elfogadva2/21ms384 KiB
6Elfogadva2/22ms316 KiB
7Elfogadva2/22ms316 KiB
8Elfogadva1/150ms5820 KiB
9Elfogadva2/286ms8820 KiB
10Elfogadva2/2101ms8752 KiB
11Elfogadva2/285ms8752 KiB
12Elfogadva2/297ms8640 KiB
13Elfogadva2/2100ms8756 KiB
14Elfogadva2/281ms8632 KiB
15Elfogadva2/279ms8504 KiB
16Elfogadva1/1116ms9376 KiB
17Elfogadva1/1105ms9388 KiB
18Elfogadva1/150ms5684 KiB
19Elfogadva2/2107ms9564 KiB
20Elfogadva2/2108ms8880 KiB
21Elfogadva2/2112ms9308 KiB
22Elfogadva2/2101ms9560 KiB
23Elfogadva2/2120ms9812 KiB
24Elfogadva2/290ms9888 KiB
25Elfogadva2/275ms8848 KiB
26Elfogadva2/297ms9160 KiB
27Elfogadva2/2116ms9384 KiB
28Elfogadva2/2119ms9788 KiB
29Elfogadva2/293ms9360 KiB