251002026-02-17 22:32:01KevinBarátnők (50 pont)cpp17Időlimit túllépés 1/501.101s64000 KiB
#include <bits/stdc++.h>
#include <queue>
using namespace std;
using ll=long long;
using pll=pair<ll, ll>;
const ll MOD=1e9+7;

ll a, b, c;
vector<vector<pll>> vec;
priority_queue<pll, vector<pll>, greater<pll>> pq;
vector<ll> dis;
set<pll> s;
vector<ll> elol;
vector<ll> hatul;
ll out=0;
ll cnt=0;

/*
ll fastPow(ll a, ll b){
    if (b==0) return 1;
    if (a==1) return 1;
    if (b%2==0) return fastPow(a*a%MOD, b/2);
    else return fastPow(a, b-1)*a%MOD;
}
*/

void dfs(ll x, pll tala){
    for (auto& z:vec[x]){
        if (dis[z.first]==dis[x]+z.second){
            if (z.first==b){
                if (s.find(tala)==s.end()){
                    s.insert(tala);
                    cnt++;
                    out+=elol[tala.first]%MOD*hatul[tala.second]%MOD;
                    out%=MOD;
                }
                //cerr << tala.first << ' ' << tala.second << '\n';
                return;
            }
            if (dis[b]%2==0 && dis[b]/2==dis[z.first]) tala={z.first, z.first};
            else if (dis[x]<(dis[b]+1)/2 && (dis[b]-1)/2<=dis[z.first]) tala={x, z.first};
            dfs(z.first, tala);
        }
    }
}

int main() {
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    ll n, m; cin >> n >> m;
    vec.resize(n);
    dis.resize(n, INT_MAX);
    elol.resize(n);
    for (ll i=0; i<m; i++){
        cin >> a >> b >> c;
        vec[a-1].push_back({b-1, c});
        vec[b-1].push_back({a-1, c});
    }
    cin >> a >> b; a--; b--;
    
    dis[a]=0;
    pq.push({0, a});
    while (pq.size()>0){
        pll x=pq.top();
        pq.pop();
        if (dis[x.second]==x.first){
            for (auto& z:vec[x.second]){
                if (dis[z.first]>dis[x.second]+z.second){
                    dis[z.first]=dis[x.second]+z.second;
                    pq.push({dis[z.first], z.first});
                }
            }
        }
    }

    queue<ll> q;
    elol.resize(n);
    elol[a]=1;
    q.push(a);
    while (q.size()>0){
        ll x=q.front();
        q.pop();
        for (auto& z:vec[x]){
            if (dis[z.first]==dis[x]+z.second){
                elol[z.first]+=elol[x];
                q.push(z.first);
            }
        }
    }

    hatul.resize(n);
    hatul[b]=1;
    q.push(b);
    while (q.size()>0){
        ll x=q.front();
        q.pop();
        for (auto& z:vec[x]){
            if (dis[z.first]==dis[x]-z.second){
                hatul[z.first]+=hatul[x];
                q.push(z.first);
            }
        }
    }

    /*
    for (auto z:dis) cerr << z << ' ';
    cerr << '\n';
    for (auto z:elol) cerr << z << ' ';
    cerr << '\n';
    for (auto z:hatul) cerr << z << ' ';
    cerr << '\n';
    */

    dfs(a, {-1, -1});
    cout << out*cnt/2;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
base1/50
1Elfogadva0/01ms316 KiB
2Időlimit túllépés0/01.083s31592 KiB
3Futási hiba0/2340ms64000 KiB
4Futási hiba0/2377ms64000 KiB
5Hibás válasz0/21ms316 KiB
6Futási hiba0/2349ms64000 KiB
7Futási hiba0/2300ms64000 KiB
8Elfogadva1/150ms5412 KiB
9Időlimit túllépés0/21.1s8356 KiB
10Futási hiba0/2671ms64000 KiB
11Futási hiba0/2345ms64000 KiB
12Időlimit túllépés0/21.083s7848 KiB
13Futási hiba0/2526ms64000 KiB
14Futási hiba0/2250ms64000 KiB
15Futási hiba0/2238ms64000 KiB
16Hibás válasz0/1166ms8372 KiB
17Időlimit túllépés0/11.088s24256 KiB
18Hibás válasz0/143ms5428 KiB
19Időlimit túllépés0/21.101s26980 KiB
20Időlimit túllépés0/21.093s25184 KiB
21Időlimit túllépés0/21.09s21960 KiB
22Időlimit túllépés0/21.082s33684 KiB
23Időlimit túllépés0/21.088s25536 KiB
24Futási hiba0/2532ms64000 KiB
25Futási hiba0/2690ms64000 KiB
26Futási hiba0/2620ms64000 KiB
27Időlimit túllépés0/21.09s31076 KiB
28Időlimit túllépés0/21.087s9392 KiB
29Időlimit túllépés0/21.09s60512 KiB