记录编号 229826 评测结果 AAAAAAAAAA
题目名称 [省常中2011S4] 聖誕節 最终得分 100
用户昵称 Gravatarliu_runda 是否通过 通过
代码语言 C++ 运行时间 0.067 s
提交时间 2016-02-20 19:47:28 内存使用 1.66 MiB
显示代码纯文本
  1. #include<cstdio>
  2. #include<cstring>
  3. #include<queue>
  4. using namespace std;
  5. int w[50020];
  6. int d[50020];
  7. struct edge{
  8. int to,next,w;
  9. }lst[100040];int len =1;
  10. int first[50020];
  11. void insert(int a,int b,int w){
  12. lst[len].next=first[a];
  13. lst[len].to=b;
  14. lst[len].w=w;
  15. first[a]=len++;
  16. }
  17. bool inq[50020];
  18. int main(){
  19. freopen("chris.in","r",stdin);
  20. freopen("chris.out","w",stdout);
  21. int n,m;
  22. scanf("%d %d",&n,&m);
  23. for(int i=1;i<=n;++i)scanf("%d",&w[i]);
  24. int a,b,c;
  25. for(int i=0;i<m;++i){
  26. scanf("%d %d %d",&a,&b,&c);
  27. insert(a,b,c);
  28. insert(b,a,c);
  29. }
  30. queue<int> q;
  31. memset(d,63,sizeof(d));
  32. d[1]=0;
  33. for(int pt=first[1];pt;pt=lst[pt].next){
  34. q.push(lst[pt].to);
  35. inq[lst[pt].to]=true;
  36. if(d[lst[pt].to]>lst[pt].w)d[lst[pt].to]=lst[pt].w;
  37. }
  38. while(!q.empty()){
  39. int v=q.front();
  40. for(int pt=first[v];pt;pt=lst[pt].next){
  41. if(d[v]+lst[pt].w<d[lst[pt].to]){
  42. d[lst[pt].to]=d[v]+lst[pt].w;
  43. if(!inq[lst[pt].to]){
  44. inq[lst[pt].to]=true;
  45. q.push(lst[pt].to);
  46. }
  47. }
  48. }
  49. inq[v]=false;
  50. q.pop();
  51. }
  52. long long ans=0;
  53. for(int i=2;i<=n;++i)ans+=w[i]*d[i];
  54. printf("%lld",ans);
  55. fclose(stdin);fclose(stdout);
  56. return 0;
  57. }