思路:
树的总价就是 每个结点的权值*到该点的最短路
代码:
#include <iostream>
#include <string.h>
#include <set>
using namespace std;
const int MAX_N=100000;
const int MAX_M=100000;
const long long INF=0x3f3f3f3f;
struct edge
{
int v,w,next;
}e[MAX_M];
int p[MAX_N],eid,n;
void init()
{
memset(p,-1,sizeof(p));
eid=0;
}
void insert(int u,int v,int w)
{
e[eid].v=v;
e[eid].w=w;
e[eid].next=p[u];
p[u]=eid++;
}
void addedge(int u,int v,int w)
{
insert(u,v,w);
insert(v,u,w);
}
typedef pair<int ,int >PII;
set<PII,less<PII> >min_heap;
set<PII,less<PII> >::iterator iter;
int dist[MAX_N];
bool vst[MAX_N];
bool dijkstra(int s)
{
memset(dist,INF,sizeof(dist));
memset(vst,0,sizeof(vst));
min_heap.insert(make_pair(0,s));
dist[s]=0;
for(int i=0;i<n;i++)
{
if(min_heap.size()==0)
return false;
iter=min_heap.begin();
int v=iter->second;
min_heap.erase(*iter);
vst[v]=true;
for(int j=p[v];j!=-1;j=e[j].next)
{
int x=e[j].v;
if(!vst[x] && dist[v]+e[j].w<dist[x])
{
min_heap.erase(make_pair(dist[x],x));
dist[x]=dist[v]+e[j].w;
min_heap.insert(make_pair(dist[x],x));
}
}
}
return true;
}
int main()
{
int m;
while(cin>>n>>m)
{
init();
int point_val[MAX_N];
for(int i=1;i<=n;i++)
{
cin>>point_val[i];
}
int u,v,w;
for(int i=0;i<m;i++)
{
cin>>u>>v>>w;
addedge(u,v,w);
}
dijkstra(1);
long long ans=0;
int flag=0;
for(int i=1;i<=n;i++)
{
if(dist[i]==INF)
{
flag=1;
break;
}
ans+=dist[i]*point_val[i];
}
if(flag)
cout<<"No Answer"<<endl;
else
cout<<ans<<endl;
}
return 0;
}