判断第k短路的权值是否小于T

直接把队友的代码拿过来了,一定很经典

  1. #include <iostream>
  2. #include <queue>
  3. #include <cstring>
  4. #include <vector>
  5.  
  6. using namespace std;
  7.  
  8. const int maxn = ;
  9. const int INF = 0x7fffffff;
  10. int N, M, S, E, K, T;
  11. int inq[maxn];
  12. int dis[maxn];
  13. int cnt[maxn];
  14.  
  15. struct Edge
  16. {
  17. int u, v, w;
  18. Edge(int a, int b, int c):u(a), v(b), w(c){}
  19. };
  20.  
  21. struct Node
  22. {
  23. int d, v;
  24. Node(int a, int b):d(a), v(b){}
  25. bool operator < (const Node &x) const {return d+dis[v]>x.d+dis[x.v];}
  26. };
  27.  
  28. struct Node1
  29. {
  30. int d, v;
  31. Node1(int a, int b):d(a), v(b){}
  32. bool operator < (const Node1 &x) const {return d>x.d;}
  33. };
  34.  
  35. vector<Edge> edge1;
  36. vector<Edge> edge2;
  37. vector<int> G1[maxn];
  38. vector<int> G2[maxn];
  39.  
  40. inline void addedge(int a, int b, int c)
  41. {
  42. edge1.push_back(Edge(a,b,c));
  43. G1[a].push_back(edge1.size()-);
  44. edge2.push_back(Edge(b,a,c));
  45. G2[b].push_back(edge2.size()-);
  46. }
  47.  
  48. void dijkstra_init()
  49. {
  50. priority_queue<Node1>Q;
  51. memset(inq, , sizeof(inq));
  52. std::fill(dis, dis+maxn, INF);
  53. dis[E] = ;
  54. Q.push(Node1(, E));
  55. while(!Q.empty())
  56. {
  57. auto x = Q.top(); Q.pop();
  58. if(inq[x.v]) continue;
  59. inq[x.v] = true;
  60. for(int i = ; i < G2[x.v].size(); ++i)
  61. {
  62. Edge &m = edge2[G2[x.v][i]];
  63. if(dis[m.v]>dis[m.u]+m.w)
  64. {
  65. dis[m.v] = dis[m.u]+m.w;
  66. Q.push(Node1(dis[m.v], m.v));
  67. }
  68. }
  69. }
  70. }
  71.  
  72. int k_th()
  73. {
  74. memset(cnt, , sizeof(cnt));
  75. priority_queue<Node>Q;
  76. if(dis[S]>=INF) return -;
  77. Node e(, S);
  78. Q.push(e);
  79.  
  80. while(!Q.empty())
  81. {
  82. Node x = Q.top();Q.pop();
  83.  
  84. cnt[x.v]++;
  85.  
  86. if(x.v == E)
  87. {
  88. if(x.d>T) return -;
  89. if(cnt[x.v] == K) return x.d;
  90. }
  91.  
  92. if (cnt[x.v] > K) continue;
  93.  
  94. for(unsigned int i = ; i < G1[x.v].size(); i++)
  95. {
  96. Node n(x.d+edge1[G1[x.v][i]].w, edge1[G1[x.v][i]].v);
  97. if(cnt[n.v] != K)
  98. Q.push(n);
  99. }
  100. }
  101. return -;
  102. }
  103.  
  104. int main()
  105. {
  106. while(scanf("%d%d", &N, &M) != EOF)
  107. {
  108. edge1.clear();
  109. edge2.clear();
  110.  
  111. for(int i = ; i < maxn; ++i)
  112. {
  113. G1[i].clear();
  114. G2[i].clear();
  115. }
  116.  
  117. scanf("%d%d%d%d", &S, &E, &K, &T);
  118.  
  119. for(int i = ; i <= M; ++i)
  120. {
  121. int a, b, c;
  122. scanf("%d%d%d", &a, &b, &c);
  123. addedge(a, b, c);
  124. }
  125.  
  126. dijkstra_init();
  127.  
  128. int ans = k_th();
  129.  
  130. if(ans <= T && ans != -) printf("yareyaredawa\n");
  131. else printf("Whitesnake!\n");
  132. }
  133. return ;
  134. }

图论&搜索:K短路-启发式搜索的更多相关文章

  1. Remmarguts' Date POJ - 2449 (A*搜索|k短路)

    "Good man never makes girls wait or breaks an appointment!" said the mandarin duck father. ...

  2. 数据结构&图论:K短路-可持久化可并堆

    本来A*就可以搞定的题,为了怕以后卡复杂度,找了个这么个方法 现阶段水平不够就不补充算法分析部分了 对于图G,建立一个以终点t为起点的最短路径构成的最短路径树 (就是反着跑一遍最短路,然后对于一个不为 ...

  3. POJ 2449 Dijstra + A* K短路

    这题一开始的思路应该是直接从源点进行BFS搜索K短路. 但这样的复杂度在点数和K的值增大后将会变得很大. 而A*算法则构造一个h(x),在进行BFS时,每次都抛出最小的h(x)从而使汇点的出队速度加快 ...

  4. 【10.9校内练习赛】【搜索】【2-sat】【树链剖分】【A_star k短路】【差分约束+判负环】

    在洛谷上复制的题目! P3154 [CQOI2009]循环赛 题目描述 n队伍比赛,每两支队伍比赛一次,平1胜3负0. 给出队伍的最终得分,求多少种可能的分数表. 输入输出格式 输入格式: 第一行包含 ...

  5. 多源第k短路 (ford + 重新定义编号) / 出发点、终点确定的第k短路 (Spfa+ 启发搜索)

    第k短路 Description 一天,HighLights实在是闲的不行,他选取了n个地点,n各地点之间共有m条路径,他想找到这m条路径组成的第k短路,你能帮助他嘛? Input 第一行三个正整数, ...

  6. 与图论的邂逅07:K短路

    在做最短路的题时我们不免会碰到许多求次短路的题,然而我们也能很快地想到解决的办法: 用dijkstra跑一遍最短路,当终点第二次被取出时就是次短路了.时间复杂度为O((N+M)logN).实际上前面得 ...

  7. 图论(A*算法,K短路) :POJ 2449 Remmarguts' Date

    Remmarguts' Date Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 25216   Accepted: 6882 ...

  8. WC2015 k小割(k短路+暴力+搜索)

    首先这道题不是非同一般的恶心,三个数据层次对应三个程序= = PROBLEM:http://uoj.ac/problems解法: 1~2直接暴力枚举边的选择与否+判断就行了 7~14可以发现是一个平面 ...

  9. 【模板篇】k短路 SDOI2010 魔法猪学院

    题目传送门 吐槽时间 题目分析 代码 题目の传送门 都成了一道模板题了OvO ============================================================= ...

随机推荐

  1. 遇到Intel MKL FATAL ERROR: Cannot load libmkl_avx2.so or libmkl_def.so问题的解决方法

    运行一个基于tensorflow的模型时,遇到Intel MKL FATAL ERROR: Cannot load libmkl_avx2.so or libmkl_def.so问题. 解决方法:打开 ...

  2. Alpha事后诸葛会议

    [设想和目标] Q1:我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? "小葵日记"是为了解决18-30岁年轻用户在记录生活时希望得到一美体验友好 ...

  3. 博弈---巴什博奕(Bash Game)(博弈入门)

    巴什博奕(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规 定每次至少取一个,最多取m个.最后取光者得胜. 显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走 ...

  4. Java clone() 浅拷贝 深拷贝

    假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short, ...

  5. php获取指定div内容

    <?php $p="http://127.0.0.1:8080/website/index.html"; $ch = curl_init(); curl_setopt($ch ...

  6. (十二)Jmeter之Bean Shell的使用(一)

    一.什么是Bean Shell BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法; BeanShell是一种松散类型的脚本语言(这点和JS类似); BeanS ...

  7. js获取窗口滚动条高度、窗口可视范围高度、文档实际内容高度、滚动条离浏览器底部的高度

    1.获取窗口可视范围的高度 //获取窗口可视范围的高度 function getClientHeight(){ var clientHeight=0; if(document.body.clientH ...

  8. Hibernate 中 load() 方法导致的 noSession 异常

    之所以要写这个,是因为最近碰到了一个延迟加载的 load() 导致出现 noSession 的异常. 下面第三种方式解决这个问题需要用到一个本地线程的对象,也就是 ThreadLocal 类,之前写过 ...

  9. 平衡树以及AVL树

    平衡树是计算机科学中的一类数据结构. 平衡树是计算机科学中的一类改进的二叉查找树.一般的二叉查找树的查询复杂度是跟目标结点到树根的距离(即深度)有关,因此当结点的深度普遍较大时,查询的均摊复杂度会上升 ...

  10. UVA12585_Poker End Games

    题目是这样的,每个人手中有a和b的钱数,c为a和b中间最小的一个. 每个回合,两个人胜利的概率都是0.5,胜利者从失败者手中获得c的钱数. 如果有一个人手中没钱的话,那么他就failer,游戏结束. ...