04

http://acm.hdu.edu.cn/showproblem.php?pid=6705

分析;先把每条边以 形式放进堆,堆按路径权值从小到大排序,然后每次取出堆顶,用v的出边扩展 新的路径。但是一个点的出度可能会非常大(如菊花图),可以发现,将出边排序之后,

每次只需要扩 展当前点最小的出边,和扩展到当前点的边的下一条边即可。堆中需要记录当前结点,当前距离,上一 节点距离,扩展到当前节点时下一条应该扩展的边。

(注意,如果一次性扩展当前点连出去的所有权值 相同的边,是会TLE的,实际上也是没有必要的。)
复杂度:O(k*log(m+k))

  1. #include<queue>
  2. #include<vector>
  3. #include<algorithm>
  4. #include<cstdio>
  5. #include<cstring>
  6. using namespace std;
  7. typedef long long ll;
  8. #define pb push_back
  9. const int M=1e5+;
  10. struct node{
  11. ll cost;
  12. int u,id;
  13. node(ll costt=,int uu=,int idd= ){
  14. cost=costt;
  15. u=uu;
  16. id=idd;
  17. }
  18. bool operator < ( const node &b)const{
  19. return cost>b.cost;
  20. }
  21. };
  22. #define pli pair<ll,int>
  23. vector<pli> e[M];
  24. ll ans[M];
  25. int a[M];
  26. priority_queue<node> que;
  27. int main(){
  28. int t;
  29. scanf("%d",&t);
  30. while(t--){
  31. int n,m,q;
  32. scanf("%d%d%d",&n,&m,&q);
  33. for(int i=;i<=n;i++)
  34. e[i].clear();
  35. while(!que.empty())
  36. que.pop();
  37. for(int i=;i<=m;i++){
  38. int u,v;
  39. ll w;
  40. scanf("%d%d%lld",&u,&v,&w);
  41. e[u].pb(pli(w,v));
  42. }
  43. int maxxk=;
  44. for(int i=;i<=q;i++){
  45. scanf("%d",&a[i]);
  46. maxxk=max(maxxk,a[i]);
  47. }
  48. for(int i=;i<=n;i++)
  49. sort(e[i].begin(),e[i].end());
  50. for(int i=;i<=n;i++)
  51. if(e[i].size())
  52. que.push(node(e[i][].first,i,));
  53. int tot=;
  54. while(!que.empty()){
  55. node now=que.top();
  56. que.pop();
  57. int u=now.u;
  58. int id=now.id;
  59. ll Cost=now.cost;
  60. if(Cost)
  61. ans[++tot]=Cost;
  62. if(tot==maxxk)
  63. break;
  64. if(id<(int)e[u].size()-)
  65. que.push(node(Cost-e[u][id].first+e[u][id+].first,u,id+));
  66. int v=e[u][id].second;
  67. if(e[v].size())
  68. que.push(node(Cost+e[v][].first,v,));
  69. }
  70. for(int i=;i<=q;i++)
  71. printf("%lld\n",ans[a[i]]);
  72. }
  73. return ;
  74. }

ccpc20190823的更多相关文章

随机推荐

  1. retrofit 上传文件 跟参数

    @Multipart @POST("postFied") Call<Void> postFied(@PartMap Map<String,String> m ...

  2. 快速排序&基数排序

    //快速排序 #include<stdio.h> void QuickSort(int R[],int low,int high) { int i=low,j=high; int pivo ...

  3. 微信小程序官方示例 官方weui-wxss下载于安装 详解

    1.小程序示例源码:https://github.com/wechat-miniprogram/miniprogram-demo 2.微信 weui下载地址:https://github.com/we ...

  4. 编程作业2.1:Logistic regression

    题目 在这部分的练习中,你将建立一个逻辑回归模型来预测一个学生是否能进入大学.假设你是一所大学的行政管理人员,你想根据两门考试的结果,来决定每个申请人是否被录取.你有以前申请人的历史数据,可以将其用作 ...

  5. PAT Advanced 1010 Radix(25) [⼆分法]

    题目 Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? The ...

  6. ZJNU 1699 - Bits

    可得应当优先寻找最大的2^n-1这个数 如果l的位数不等于r的位数,那么这个数 2^n-1 就是最优解(每一位全为1) 如果l和r的位数相同,先看r是否符合 2^n-1,符合直接返回,不符合的话拆除最 ...

  7. [HAOI2018]苹果树(组合数学)

    首先有个很奇妙而且很有用的性质:每个二叉树对应唯一的中序遍历,然后每个二叉树出现概率相同.所以n个节点的二叉树形态是n!种(题目中说了*n!已经是提示了),对每种方案求和即可得到期望.令f[i]表示i ...

  8. visual studio2019下静态链接库的制作

    创建静态库项目 项目名称为20199324lib // pch.h #ifndef __PCH__ #define __PCH__ extern int add(int a, int b);//ext ...

  9. vi几个常用的命令

    1.同时打开多个文件:vi 1.txt 2.txt 3.txt 在多个文件中来回切换,命令行模式输入“:next"表示下一个,输入":previous"代表进入上一个,” ...

  10. Adobe Photoshop、Adobe Illustrator、Bohemian的Sketch、Figma比较

    整体来说: Adobe Photoshop:位图图像编辑处理,更适合图片编辑和数码绘画处理: Adobe Illustrator:矢量设计,更适合图标设计和图形设计处理: Sketch:矢量设计,更适 ...