判断第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. 王者荣耀交流协会-Alpha发布用户使用报告

    用户数量:10人 姓名如下(包括化名):张小斌.王瑞瑞.蛋蛋.小美.晨曦.小丽.张利刚.小闫.小谢.小崔 寻找的用户多为王者荣耀交流协会成员的同学,对管理时间有着强烈的需求,也对PSP Daily软件 ...

  2. 冲刺ing-5

    第五次Scrum冲刺 队员完成的任务 队员 完成任务 吴伟华 Leangoo的看板截图,燃尽图 蔺皓雯 编写博客 蔡晨旸 测试 曾茜 测试 鲁婧楠 测试 杨池宇 测试 成员遇到的问题 队员 问题 吴伟 ...

  3. 20172326『Java程序设计』课程结对编程练习_四则运算第二周阶段总结

    20172326『Java程序设计』课程结对编程练习_四则运算第二周阶段总结 小组成员 20172313 余坤澎 20172332 于欣月 20172326 康皓越 小组编程照片 设计思路 通过一个E ...

  4. Visual C++ 8.0对象布局

    哈哈,从M$ Visual C++ Team的Andy Rich那里又偷学到一招:VC8的隐含编译项/d1reportSingleClassLayout和/d1reportAllClassLayout ...

  5. 解决Max retries exceeded with url的问题

    requests.exceptions.ConnectionError: HTTPSConnectionPool(host='itunes.apple.com', port=443): Max ret ...

  6. CCF——数列分段201509-1

    问题描述 给定一个整数数列,数列中连续相同的最长整数序列算成一段,问数列中共有多少段? 输入格式 输入的第一行包含一个整数n,表示数列中整数的个数. 第二行包含n个整数a1, a2, …, an,表示 ...

  7. 结对项目——fault,error,failure的程序设计

    一.结对编程内容: 1.不能触发Fault. 2.触发Fault,但是不触发Error. 3.触发Error,但不触发Failure. 二.结对编程人员 1.周宗耀.周浩: 2.结对截图: 三.结对项 ...

  8. (十)Jmeter中的Debug Sampler介绍

    一.Debug Sampler介绍: 使用Jmeter开发脚本时,难免需要调试,这时可以使用Jmeter的Debug Sampler,它有三个选项:JMeter properties,JMeter v ...

  9. CentOS 6.5安装配置LAMP服务器(Apache+PHP5+MySQL)

    1.配置防火墙,开启80端口.3306端口vi /etc/sysconfig/iptables-A INPUT -m state --state NEW -m tcp -p tcp --dport 8 ...

  10. js & array to string

    js & array to string https://stackoverflow.com/questions/13272406/convert-string-with-commas-to- ...