题意戳这里:https://blog.csdn.net/qq_42217376/article/details/89514327
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<queue>
using namespace std;
typedef long long LL;
typedef pair<LL,int>P;
const LL inf=0x3f3f3f3f3f3f3f3f;
const int Max_n=5e5+10;
int head[Max_n];
LL dis[Max_n],w[Max_n];
int cnt;
struct Edge{
int to,cost;
int next;
}edge[2*Max_n];
priority_queue<P,vector<P>,greater<P> >q;
void add(int from,int to,int cost){
edge[cnt].to=to;
edge[cnt].cost=cost;
edge[cnt].next=head[from];
head[from]=cnt++;
}
LL Dijkstra(int n){
for(int i=1;i<=n;i++) dis[i]=inf;
q.push(P(0,1)); dis[1]=0;
while(!q.empty()){
P p=q.top();q.pop();
int v=p.second;
if(dis[v]<p.first) continue;
for(int i=head[v];i!=-1;i=edge[i].next){
if(dis[edge[i].to]>dis[v]+edge[i].cost){
dis[edge[i].to]=dis[v]+edge[i].cost;
q.push(P(dis[edge[i].to],edge[i].to));
}
}
}
LL ans=0;
for(int i=1;i<=n;i++){
ans+=w[i]*dis[i];
if(dis[i]==inf)
return -1;
}
return ans;
}
int main(){
int T;
scanf("%d",&T);
while(T--){
cnt=0;
int n,m;
scanf("%d%d",&n,&m);
memset(head,-1,sizeof(head));
for(int i=1;i<=n;i++)
scanf("%lld",&w[i]);
for(int i=1;i<=m;i++){
int from,to,cost;
scanf("%d%d%d",&from,&to,&cost);
add(from,to,cost);
add(to,from,cost);
}
if(n==0||n==1){
printf("0\n");
continue;
}
if(m==0){
printf("No Answer\n");
continue;
}
LL ans=Dijkstra(n);
if(ans==-1) printf("No Answer\n");
else printf("%lld\n",ans);
}
return 0;
}