#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int>pii;
const int N=1005;
int n;
int vis[N],f[N];
int dis[N],cnt[N];
int trans[N][N];
vector<pii>G[N];
void Dijsktra(){
priority_queue<pii,vector<pii>,greater<pii>>q;
for(int i=0;i<n;i++)
cnt[i]=1,dis[i]=f[i],
q.push(make_pair(f[i],i));
while(!q.empty()){
int u1=q.top().second;
q.pop();
if(vis[u1])continue;
vis[u1]=1;
for(auto cur:G[u1]){
int u2=cur.first;
int v=cur.second;
if(vis[u2]){
if(f[u2]+dis[u1]<dis[v]){
cnt[v]=cnt[u1]*cnt[u2];
dis[v]=f[u2]+dis[u1];
q.push(make_pair(dis[v],v));
}
else if(dis[u2]+dis[u1]==dis[v])
cnt[v]+=cnt[u1]*cnt[u2];
}
}
}
cout<<dis[0]<<" "<<cnt[0]<<endl;
}
int main(){
cin>>n;
for(int i=0;i<n;i++)cin>>f[i];
int x,y,z;
while(cin>>x>>y>>z){
G[x].push_back(make_pair(y,z));
if(x==y)continue;
G[y].push_back(make_pair(x,z));
}
Dijsktra();
return 0;
}
这题基本上就一个最短路模板加一个求方案数,求方案数学点最基础的排列组合就能做,是怎么做到蓝题的?