思路:建立一个虚拟点,并将虚拟点链接所有节点 以虚拟点为单源,dijkstra
感觉没问题但0pts
#include<bits/stdc++.h>
#define maxn 1010
#define S 1005
#define inf (1ull<<63)-1
#define LL unsigned long long
#define maxm 1000005
using namespace std;
priority_queue<pair<LL,LL> >q;
LL dis[maxn],vis[maxn],h[maxn];
LL to[maxm],val[maxm],nxt[maxm];
LL cost[maxn],cnt,n;
LL ans[maxn];
void addedge(LL a,LL b,LL c){
cnt++;
to[cnt]=b;
val[cnt]=c;
nxt[cnt]=h[a];
h[a]=cnt;
}
void dijkstra(){
for(int i=0;i<n;i++) dis[i]=inf;
dis[S]=0;
ans[S]=1;
q.push({0,S});
while(!q.empty()){
LL u=q.top().second;
q.pop();
if(vis[u]) continue;
vis[u]=1;
for(LL i=h[u];i;i=nxt[i]){
if(!vis[to[i]]){
if(dis[to[i]]==dis[u]+val[i]){
ans[to[i]]+=ans[u];
}
else if(dis[to[i]]>dis[u]+val[i]){
dis[to[i]]=dis[u]+val[i];
ans[to[i]]=ans[u];
q.push({-dis[to[i]],to[i]});
}
}
}
}
}
int main(){
cin>>n;
for(LL i=0;i<n;i++){
cin>>cost[i];
}
LL a,b,c;
while(cin>>a>>b>>c){
addedge(a,c,cost[b]);
addedge(b,c,cost[a]);
}
for(LL i=0;i<n;i++){
addedge(S,i,cost[i]);
}
dijkstra();
cout<<dis[0]<<" "<<ans[0];
return 0;
}