题目链接

  1. /*
  2. *题目大意:
  3. *给定v个点的重量,并给定e条边,每条边具有一个权值;
  4. *在e条边中选v-1条边使这v个点成为一棵树;
  5. *定义这棵树的代价为(每棵子树节点重量和其子树根到父节点的边的权值的乘积)之和;
  6. *求以1为根节点的树的最小代价;
  7. *
  8. *算法思想:
  9. *每个点的价值为该点到达根结点所需经过的边权之和乘以该结点重量;
  10. *即要让到达每个结点经过的边的单位价格之和最小;
  11. *即可转化为最短路问题;
  12. *做的时候WA了很多次,需要考虑各种细节问题;
  13. *精度问题,用long long;
  14. *没答案时输出“No Answer”,当n为0或1是输出为0;
  15. *最大值INF取值过小或者过大,过小可能小于里面的权值,过大相加时有可能会溢出,妈的;
  16. **/
  17. #include<iostream>
  18. #include<cstring>
  19. #include<cstdlib>
  20. #include<queue>
  21. #include<cstdio>
  22. #include<climits>
  23. #include<algorithm>
  24. using namespace std;
  25.  
  26. typedef long long LL;
  27.  
  28. const long long INF=0xffffffffff;
  29. const int N=50010;
  30. const int M=100010;
  31.  
  32. struct node
  33. {
  34. int to;
  35. int w;
  36. int next;
  37. };
  38.  
  39. node edge[M];
  40. int head[M];
  41. int idx;
  42. LL dist[N];
  43. int value[N];
  44. int n,m;
  45.  
  46. void Addedge(int u,int v,int w)
  47. {
  48. edge[idx].w=w;
  49. edge[idx].to=v;
  50. edge[idx].next=head[u];
  51. head[u]=idx++;
  52. }
  53.  
  54. LL SPFA(int s)
  55. {
  56. queue<int>Q1;
  57. int inq[N];
  58. for(int i=0; i<=n; i++)
  59. {
  60. dist[i]=INF;
  61. inq[i]=0;
  62. }
  63. dist[s]=0;
  64. Q1.push(s);
  65. inq[s]++;
  66. while(!Q1.empty())
  67. {
  68. int q=Q1.front();
  69. Q1.pop();
  70. inq[q]--;
  71. if(inq[q]>n)//负权环
  72. return -1;
  73. int k=head[q];
  74. while(k>=0)
  75. {
  76. if(dist[edge[k].to]>dist[q]+edge[k].w)
  77. {
  78. dist[edge[k].to]=edge[k].w+dist[q];
  79. if(!inq[edge[k].to])
  80. {
  81. inq[edge[k].to]++;
  82. Q1.push(edge[k].to);
  83. }
  84. }
  85. k=edge[k].next;
  86. }
  87. }
  88.  
  89. LL res=0;
  90. for(int i=1; i<=n; i++)
  91. {
  92. if(dist[i]==INF)
  93. return -1;
  94. // cout<<"dist[i]=="<<dist[i]<<endl;
  95. res+=value[i]*dist[i];
  96. }
  97. return res;
  98. }
  99.  
  100. int main()
  101. {
  102. //freopen("C:\\Users\\Administrator\\Desktop\\kd.txt","r",stdin);
  103. int tcase;
  104. scanf("%d",&tcase);
  105. while(tcase--)
  106. {
  107. scanf("%d%d",&n,&m);
  108. memset(head, -1, sizeof(head));
  109. memset(value, 0, sizeof(value));
  110. idx=0;
  111. for(int i=1; i<=n; i++)
  112. scanf("%d",&value[i]);
  113. int u,v,w;
  114. for(int i=0; i<m; i++)
  115. {
  116. scanf("%d%d%d",&u,&v,&w);
  117. Addedge(u,v,w);
  118. Addedge(v,u,w);
  119. }
  120. if(n==0||m==0)
  121. {
  122. printf("0\n");
  123. continue;
  124. }
  125. LL res=SPFA(1);
  126. if(res==-1)
  127. printf("No Answer\n");
  128. else
  129. printf("%lld\n",res);
  130. }
  131. return 0;
  132. }

LD1-B(最短路径-SPFA)的更多相关文章

  1. [最短路径SPFA] POJ 1847 Tram

    Tram Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 14630 Accepted: 5397 Description Tra ...

  2. 最短路径--SPFA 算法

    适用范围:给定的图存在负权边,这时类似Dijkstra等算法便没有了用武之地,而Bellman-Ford算法的复杂度又过高,SPFA算法便派上用场了. 我们约定有向加权图G不存在负权回路,即最短路径一 ...

  3. 最短路径 SPFA P3371 【模板】单源最短路径(弱化版)

    P3371 [模板]单源最短路径(弱化版) SPFA算法: SPFA 算法是 Bellman-Ford算法 的队列优化算法的别称,通常用于求含负权边的单源最短路径,以及判负权环.SPFA 最坏情况下复 ...

  4. 最短路径——SPFA算法

    一.前提引入 我们学过了Bellman-Ford算法,现在又要提出这个SPFA算法,为什么呢? 考虑一个随机图(点和边随机生成),除了已确定最短路的顶点与尚未确定最短路的顶点之间的边,其它的边所做的都 ...

  5. 图的最短路径-----------SPFA算法详解(TjuOj2831_Wormholes)

    这次整理了一下SPFA算法,首先相比Dijkstra算法,SPFA可以处理带有负权变的图.(个人认为原因是SPFA在进行松弛操作时可以对某一条边重复进行松弛,如果存在负权边,在多次松弛某边时可以更新该 ...

  6. luogu P3371 & P4779 单源最短路径spfa & 最大堆优化Dijkstra算法

    P3371 [模板]单源最短路径(弱化版) 题目背景 本题测试数据为随机数据,在考试中可能会出现构造数据让SPFA不通过,如有需要请移步 P4779. 题目描述 如题,给出一个有向图,请输出从某一点出 ...

  7. 最短路径----SPFA算法

    求最短路径的算法有许多种,除了排序外,恐怕是ACM界中解决同一类问题算法最多的了.最熟悉的无疑是Dijkstra,接着是Bellman-Ford,它们都可以求出由一个源点向其他各点的最短路径:如果我们 ...

  8. 枚举最短路径+SPFA

    Harry Potter and the Final Battle Submit Status Description The final battle is coming. Now Harry Po ...

  9. 【SPFA与Dijkstra的对比】CDOJ 1961 咸鱼睡觉觉【差分约束-负权最短路径SPFA】

    差分约束系统,求最小值,跑最长路. 转自:https://www.cnblogs.com/ehanla/p/9134012.html 题解:设sum[x]为前x个咕咕中至少需要赶走的咕咕数,则sum[ ...

随机推荐

  1. java 中的反射

    反射技术并不陌生,如何使用 ? 获取到类的全名 即可获取类中所有的信息: 构造.方法.成员变量等: 反射技术好多框架在使用,比如以前我们用jdbc,Class.forName("com.my ...

  2. .net自定义控件

    一.[.net自定义控件]TextBox控件重写 之NumTextBox 参考博客:http://www.yongfa365.com/Item/NumTextBox.html 二.[.net自定义控件 ...

  3. 计数dp-hdu-4054-Number String

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4055 题目大意: 给一个只含‘I','D','?'三种字符的字符串,I表示当前数字大于前面的数字,D ...

  4. Android中的Apk的加固(加壳)原理解析和实现

    一.前言 今天又到周末了,憋了好久又要出博客了,今天来介绍一下Android中的如何对Apk进行加固的原理.现阶段.我们知道Android中的反编译工作越来越让人操作熟练,我们辛苦的开发出一个apk, ...

  5. RunTime 应用实例–关于埋点的思考

    埋点是现在很多App中都需要用到的,这个问题可能每个人都能处理,但是怎样来减少埋点所带来的侵入性,怎样用更加简洁的方式来处理埋点问题,怎样减少误埋,如果上线了发现少埋了怎么办?下面是本文讨论的重点: ...

  6. Eclipse中使用git把项目导入到osc@git中

    方便Eclipse用户使用Git把项目导入到osc@git中进行管理. Eclipse Git osc@git 一.原有项目:  项目名为TestGit 二.在osc@git上面创建一个新项目库. 填 ...

  7. 【原创】FAT32系统硬盘的数据恢复实例,这篇文章也是从自己QQ空间的,转移过来的

    FAT32系统硬盘的数据恢复实例软件:win hex(16进制的编辑器)恢复内容:在FAT32中恢复一张图片1.首先我们格式化一个分区为空,让分区的系统选为FAT32系统格式化.如下: psb.jpg ...

  8. Python进阶:函数式编程实例(附代码)

    Python进阶:函数式编程实例(附代码) 上篇文章"几个小例子告诉你, 一行Python代码能干哪些事 -- 知乎专栏"中用到了一些列表解析.生成器.map.filter.lam ...

  9. codevs 1689 搭建高塔

    /*机智sort二维转一维*/ #include<iostream> #include<cstdio> #include<cstring> #include< ...

  10. C#_事件委托

    CarDealer类 事件发布程序 using System; using System.Collections.Generic; using System.Linq; using System.Te ...