251492026-02-18 09:25:05KevinBará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 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;
}

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, rossz=0;

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);
                    ll szam=elol[tala.first]*hatul[tala.second];
                    rossz+=szam*szam%MOD;
                }
                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;
    vector<bool> check(n);
    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];
                if (!check[z.first]){
                    q.push(z.first);
                    check[z.first]=true;
                }
            }
        }
    }

    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';
    */
    
    
    out=elol[b]*elol[b]%MOD;
    dfs(a, {-1, -1});
    //cout << out << ' ' << rossz << '\n';
    cout << out-rossz;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
base1/50
1Elfogadva0/01ms508 KiB
2Időlimit túllépés0/01.083s31340 KiB
3Futási hiba0/2418ms64000 KiB
4Futási hiba0/2331ms64000 KiB
5Hibás válasz0/21ms508 KiB
6Futási hiba0/2418ms64000 KiB
7Futási hiba0/2307ms64000 KiB
8Elfogadva1/145ms5428 KiB
9Időlimit túllépés0/21.09s8356 KiB
10Futási hiba0/2713ms64000 KiB
11Futási hiba0/2335ms64000 KiB
12Időlimit túllépés0/21.088s8360 KiB
13Futási hiba0/2521ms64000 KiB
14Futási hiba0/2236ms64000 KiB
15Futási hiba0/2207ms64000 KiB
16Hibás válasz0/1130ms8116 KiB
17Időlimit túllépés0/11.082s20156 KiB
18Hibás válasz0/145ms5428 KiB
19Időlimit túllépés0/21.085s22464 KiB
20Időlimit túllépés0/21.101s26168 KiB
21Időlimit túllépés0/21.08s21056 KiB
22Időlimit túllépés0/21.09s22920 KiB
23Időlimit túllépés0/21.087s15532 KiB
24Futási hiba0/2711ms64000 KiB
25Futási hiba0/2740ms64000 KiB
26Futási hiba0/2985ms64000 KiB
27Időlimit túllépés0/21.093s26464 KiB
28Időlimit túllépés0/21.085s8824 KiB
29Időlimit túllépés0/21.09s47844 KiB