题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6166

题意:给你一个有向图,然后给你k个点,求其中一个点到另一个点的距离的最小值。

解法:枚举二进制位按照标号当前位为1 和当前位为0分为两个集合,每次求解两个集合之间的最短路即可覆盖到所有的点对。时间复杂度20*dijstla时间,这样做的正确性在哪?显然我们需要的答案至少有一个二进制位不同,那么这样求解肯定可以找到正确答案,事实上还可以随机分组emmmm。。。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long LL;
  4. const int maxn = 100010;
  5. const LL inf = 0x3f3f3f3f3f3f3f3f;
  6. struct edge{
  7. int to,val,next;
  8. }E[maxn];
  9. int head[maxn],edgecnt,a[maxn];
  10. bool vis[maxn];
  11. LL dis[maxn];
  12. void initedge(){
  13. edgecnt=0;
  14. memset(head,-1,sizeof(head));
  15. }
  16. void add(int u, int v, int w){
  17. E[edgecnt].to=v,E[edgecnt].val=w,E[edgecnt].next=head[u],head[u]=edgecnt++;
  18. }
  19. struct node{
  20. int x;
  21. LL step;
  22. node(int x, LL step):x(x),step(step){}
  23. bool operator < (const node &rhs) const{
  24. return step>rhs.step;
  25. }
  26. };
  27. priority_queue<node>q;
  28. LL Dijstra(){
  29. while(!q.empty()){
  30. node now=q.top(); q.pop();
  31. if(vis[now.x]) return now.step;
  32. int u=now.x;
  33. for(int i=head[u]; ~i; i=E[i].next){
  34. int to = E[i].to;
  35. if(dis[to]>dis[u]+E[i].val){
  36. dis[to]=dis[u]+E[i].val;
  37. q.push(node(to,dis[to]));
  38. }
  39. }
  40. }
  41. return inf;
  42. }
  43. void init(){
  44. memset(vis, 0, sizeof(vis));
  45. for(int i=0; i<maxn; i++) dis[i]=inf;
  46. while(!q.empty()) q.pop();
  47. }
  48. LL work(int k)
  49. {
  50. LL ans = inf;
  51. for(int i=0; i<20; i++){
  52. init();
  53. for(int j=1; j<=k; j++){
  54. if(a[j]&(1<<i)){
  55. q.push(node(a[j],0)),dis[a[j]]=0;
  56. }
  57. else{
  58. vis[a[j]]=1;
  59. }
  60. }
  61. ans = min(ans, Dijstra());
  62. init();
  63. for(int j=1; j<=k; j++){
  64. if(a[j]&(1<<i)){
  65. vis[a[j]]=1;
  66. }
  67. else{
  68. q.push(node(a[j],0)),dis[a[j]]=0;
  69. }
  70. }
  71. ans = min(ans, Dijstra());
  72. }
  73. return ans;
  74. }
  75. int T,n,m,k,ks;
  76. int main()
  77. {
  78. ks = 0;
  79. scanf("%d", &T);
  80. while(T--)
  81. {
  82. initedge();
  83. scanf("%d %d",&n,&m);
  84. for(int i=1; i<=m; i++){
  85. int u, v, w;
  86. scanf("%d %d %d", &u,&v,&w);
  87. add(u, v, w);
  88. }
  89. scanf("%d", &k);
  90. for(int i=1; i<=k; i++) scanf("%d", &a[i]);
  91. LL ans = work(k);
  92. printf("Case #%d: %lld\n", ++ks, ans);
  93. }
  94. return 0;
  95. }

2017多校第9场 HDU 6166 Senior Pan 堆优化Dij的更多相关文章

  1. 2017多校第9场 HDU 6169 Senior PanⅡ 数论,DP,爆搜

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6169 题意:给了区间L,R,求[L,R]区间所有满足其最小质数因子为k的数的和. 解法: 我看了这篇b ...

  2. HDU 6166.Senior Pan()-最短路(Dijkstra添加超源点、超汇点)+二进制划分集合 (2017 Multi-University Training Contest - Team 9 1006)

    学长好久之前讲的,本来好久好久之前就要写题解的,一直都没写,懒死_(:з」∠)_ Senior Pan Time Limit: 12000/6000 MS (Java/Others)    Memor ...

  3. HDU 6166 Senior Pan (最短路变形)

    题目链接 Problem Description Senior Pan fails in his discrete math exam again. So he asks Master ZKC to ...

  4. 2017多校第9场 HDU 6170 Two strings DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6170 题意:给了2个字符串,其中第2个字符串包含.和*两种特别字符,问第二个字符串能否和第一个匹配. ...

  5. 2017多校第9场 HDU 6161 Big binary tree 思维,类似字典树

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6161 题意: 题目是给一棵完全二叉树,从上到下从左到右给每个节点标号,每个点有权值,初始权值为其标号, ...

  6. 2017多校第10场 HDU 6181 Two Paths 次短路

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6181 题意:给一个图,求出次短路. 解法:我之前的模板不能解决这种图,就是最短路和次短路相等的情况,证 ...

  7. 2017多校第10场 HDU 6180 Schedule 贪心,multiset

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6180 题意:给了一些任务的开始时间和终止时间,现在让我们安排k台及机器,让这些任务在k太机器上最小,并 ...

  8. 2017多校第10场 HDU 6178 Monkeys 贪心,或者DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6178 题意:给出一棵有n个节点的树,现在需要你把k只猴子放在节点上,每个节点最多放一只猴子,且要求每只 ...

  9. 2017多校第10场 HDU 6171 Admiral 双向BFS或者A*搜索

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6171 题意: 给你一个高度为6的塔形数组,你每次只能将0与他上下相邻的某个数交换,问最少交换多少次可以 ...

随机推荐

  1. 编译 python 生成静态库 libpython2.7.so

    由于我们是C++作驱动的Python开发,驱动需要加上Python静态库libpython2.7.so.libpython2.7.so.1.0.libpython2.7.a.此处我想在python源码 ...

  2. hdu 1115 Lifting the Stone (数学几何)

    Lifting the Stone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  3. 【题解】Atcoder ARC#85 E-MUL

    ……没啥可说的.最大权闭合子图,跑下dinic就好了…… #include <bits/stdc++.h> using namespace std; #define maxn 500000 ...

  4. 【题解】CF#852 E-Casinos and travel

    天啊我怎么这么蠢……写了一个树形dp,的确发现记录的很多值并没有什么用,然而当时脑子没转过弯来还是写了这个树形dp……虽然能A但就不解释了,总之是个垃圾算法(ー̀дー́) #include <b ...

  5. HDU2089:不要62——题解

    http://acm.hdu.edu.cn/showproblem.php?pid=2089 Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer). 杭州交通管 ...

  6. 爆款PHP面试题

    $a = 3; $b = 6; if ($a = 4 || $b = 4) { $a++; $b++; } echo $a; //输出 1 echo $b; //输出 7 逛鸟哥博客,看评论区有个新手 ...

  7. group by多字段分组

    在平时的开发任务中我们经常会用到MYSQL的GROUP BY分组, 用来获取数据表中以分组字段为依据的统计数据.比如有一个学生选课表,表结构如下: Table: Subject_Selection S ...

  8. 再来说一说sudo

    app        ALL = (ALL:ALL) ALL eric.zhan ALL = (app : app) ALLDefaults:eric.zhan runas_default=app 如 ...

  9. 团队题目需求分析-NABCD

    Need: 由本人亲身体验出发,觉得很多同学记不住老师留的作业,或者上课时间记录了,但是老是忘记到底记录了什么,导致没有半大写作业,所以准备设计一个东西来帮助同学. A: 首先,我最先想到的是手机,所 ...

  10. devDependencies 和 dependencise 的区别

    在使用 npm install 安装模块或者插件的时候,在命令中可以添加俩种参数把他们写入到 pakeage.json 文件里面去: --save ( 简写 -S ) --save-dev ( 简写 ...