1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
| #include <queue> #include <vector> #pragma GCC optimize("Ofast") #include<bits/stdc++.h> using namespace std;
constexpr int N = 5e4 + 10; struct Edge{ int u, w; };
struct Node { int id, dis; Node(){} Node(int id, int dis):id(id), dis(dis){} bool operator < (const Node & a)const { return dis > a.dis; } };
vector<Edge> e[N]; int dis[N], path[N], cnt[N], member[N]; void dijistra(int s, int d){ priority_queue<Node> q; memset(dis, 0x3f, sizeof(dis)); q.push({s, 0}); dis[s] = 0; path[s] = 1; cnt[s] = member[s];
while(!q.empty()) { int id = q.top().id, dist = q.top().dis; q.pop(); if(id == d) { return; } if(dis[id] < dist) continue;
for(auto &[u, w] : e[id]) { if(dist + w < dis[u]) { dis[u] = dist + w; path[u] = path[id]; cnt[u] = member[u] + cnt[id]; q.push({u, dis[u]}); }else if(dist + w == dis[u]) { path[u] += path[id]; cnt[u] = max(cnt[u], member[u] + cnt[id]); } } } }
void solve(){ int n, m, s, d; cin >> n >> m >> s >> d; for(int i = 0;i < n; ++i) cin >> member[i]; for(int i = 0;i < m; ++i) { int u, v, w; cin >> u >> v >> w; e[u].push_back({v,w}); e[v].push_back({u, w}); }
dijistra(s, d); cout << path[d] << ' ' << cnt[d] ;
}
signed main() { hello;
solve();
world; }
|