wa了T6
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
//定义
#define int long long
int vis[1000005], cnt, dis[1000005], b[1000005];
vector<int> g[1000005];
vector<int> v[1000005];
struct Node{
int id, x;
}a[1000005];
vector<int> vis2[1005][1005];
/*
vis表示这个点有没有被访问,dis是第一个结果
b是第二个结果
g,v存图
a是堆
vis2[i][j]表示以经用i号药水加j号药水做出了哪些药水
*/
//结构体比较
bool operator<(Node x, Node y) {
return x.x < y.x;
}
bool operator<=(Node x, Node y) {
return x.x <= y.x;
}
bool operator>(Node x, Node y) {
return x.x > y.x;
}
bool operator>=(Node x, Node y) {
return x.x >= y.x;
}
bool operator==(Node x, Node y) {
return x.x == y.x;
}
//出堆
void out() {
a[1] = a[cnt];
--cnt;
int t = 1;
while(1) {
if(t * 2 > cnt) break;
if(t * 2 == cnt) {
if(a[t * 2] > a[t]) {
break;
} else {
swap(a[t * 2], a[t]);
t *= 2;
}
}
if(t * 2 + 1 <= cnt) {
Node k = min(a[t * 2], a[t * 2 + 1]);
if(k > a[t]) {
break;
} else {
if(a[t * 2] < a[t * 2 + 1]) {
swap(a[t], a[t * 2]);
t *= 2;
} else {
swap(a[t], a[t * 2 + 1]);
t = t * 2 + 1;
}
}
}
}
}
//入堆
void in(Node x) {
a[++cnt] = x;
int t = cnt;
while(a[t] < a[t / 2] && t > 1) {
swap(a[t], a[t / 2]);
t /= 2;
}
}
signed main() {
//输入
int n;
cin >> n;
for (int i = 0; i < n; ++i) {
cin >> dis[i];
in({i, dis[i]});
b[i] = 1;
}
int a1, b1, c1;
while(cin >> a1 >> b1 >> c1) {
g[a1].push_back(b1);
v[a1].push_back(c1);
g[b1].push_back(a1);
v[b1].push_back(c1);
}
//dijkstra
while(cnt > 0) {
Node u = a[1];
out();
if(vis[u.id] == 1) continue;
vis[u.id] = 1;
for (int j = 0; j < g[u.id].size(); ++j) {
if(dis[g[u.id][j]] + dis[u.id] < dis[v[u.id][j]]) {
dis[v[u.id][j]] = dis[g[u.id][j]] + dis[u.id];
b[v[u.id][j]] = b[g[u.id][j]] * b[u.id];
vis2[g[u.id][j]][u.id].push_back(v[u.id][j]);
vis2[u.id][g[u.id][j]].push_back(v[u.id][j]);
in({v[u.id][j], dis[v[u.id][j]]});
} else if(dis[g[u.id][j]] + dis[u.id] == dis[v[u.id][j]]) {
int flag = 0;
for (int k = 0; k < vis2[u.id][g[u.id][j]].size(); ++k) {
if(v[u.id][j] == vis2[u.id][g[u.id][j]][k]) {
flag = 1;
break;
}
}
if(flag == 1) continue;
b[v[u.id][j]] += b[g[u.id][j]] * b[u.id];
vis2[g[u.id][j]][u.id].push_back(v[u.id][j]);
vis2[u.id][g[u.id][j]].push_back(v[u.id][j]);
}
}
}
cout<< dis[0] << " " << b[0];
return 0;
}