思路:K短路裸题

代码:

  1. #include<queue>
  2. #include<cstring>
  3. #include<set>
  4. #include<map>
  5. #include<stack>
  6. #include<string>
  7. #include<cmath>
  8. #include<vector>
  9. #include<cstdio>
  10. #include<iostream>
  11. #include<algorithm>
  12. typedef long long ll;
  13. using namespace std;
  14. const int maxn = + ;
  15. const int maxm = + ;
  16. const int seed = ;
  17. const ll MOD = 1e9 + ;
  18. const int INF = 0x3f3f3f3f;
  19. struct Edge{
  20. int v, w, next;
  21. };
  22. struct As{
  23. int f, g, pos;
  24. bool operator < (const As a) const{
  25. return a.f == f? a.g < g : a.f < f;
  26. }
  27. };
  28. int n, m, k, tot1, tot2, T;
  29. int head1[maxn], head2[maxn], dis[maxn];
  30. bool vis[maxn];
  31. Edge edge1[maxm], edge2[maxm];
  32. void init(){
  33. memset(head1, -, sizeof(head1));
  34. memset(head2, -, sizeof(head2));
  35. tot1 = tot2 = ;
  36. }
  37. void addEdge(int u, int v, int w){
  38. edge1[tot1].v = v;
  39. edge1[tot1].w = w;
  40. edge1[tot1].next = head1[u];
  41. head1[u] = tot1++;
  42.  
  43. edge2[tot2].v = u;
  44. edge2[tot2].w = w;
  45. edge2[tot2].next = head2[v];
  46. head2[v] = tot2++;
  47. }
  48. void spfa(int st){
  49. for(int i = ; i <= n; i++) dis[i] = INF;
  50. memset(vis, false, sizeof(vis));
  51. vis[st] = true;
  52. dis[st] = ;
  53. queue<int> q;
  54. while(!q.empty()) q.pop();
  55. q.push(st);
  56. while(!q.empty()){
  57. int u = q.front();
  58. q.pop();
  59. vis[u] = false;
  60. for(int i = head2[u]; i != -; i = edge2[i].next){
  61. int v = edge2[i].v;
  62. int w = edge2[i].w;
  63. if(dis[v] > dis[u] + w){
  64. dis[v] = dis[u] + w;
  65. if(!vis[v]){
  66. vis[v] = true;
  67. q.push(v);
  68. }
  69. }
  70. }
  71. }
  72. }
  73. int Astar(int st, int end){
  74. int cnt = ;
  75. priority_queue<As> q;
  76. while(!q.empty()) q.pop();
  77. if(st == end) k++;
  78. if(dis[st] == INF) return -;
  79. As a, b;
  80. a.pos = st, a.g = , a.f = a.g + dis[st];
  81. q.push(a);
  82. while(!q.empty()){
  83. a = q.top();
  84. q.pop();
  85. if(a.f > T) return -;
  86. if(a.pos == end && a.f <= T){
  87. cnt++;
  88. if(cnt == k) return ;
  89. }
  90. for(int i = head1[a.pos]; i != -; i = edge1[i].next){
  91. b.pos = edge1[i].v;
  92. b.g = a.g + edge1[i].w;
  93. b.f = b.g + dis[b.pos];
  94. q.push(b);
  95. }
  96. }
  97. return -;
  98. }
  99. int main(){
  100. int s, e;
  101. while(~scanf("%d%d", &n, &m)){
  102. init();
  103. scanf("%d%d%d%d", &s, &e, &k, &T);
  104. for(int i = ; i <= m; i++){
  105. int u, v, w;
  106. scanf("%d%d%d", &u, &v, &w);
  107. addEdge(u, v, w);
  108. }
  109. spfa(e);
  110. int ans = Astar(s, e);
  111. if(ans == -)
  112. printf("Whitesnake!\n");
  113. else
  114. printf("yareyaredawa\n");
  115. }
  116. return ;
  117. }

ACM-ICPC 2018 沈阳赛区网络预赛 Made In Heaven(K短路)题解的更多相关文章

  1. ACM-ICPC 2018 沈阳赛区网络预赛 K Supreme Number(规律)

    https://nanti.jisuanke.com/t/31452 题意 给出一个n (2 ≤ N ≤ 10100 ),找到最接近且小于n的一个数,这个数需要满足每位上的数字构成的集合的每个非空子集 ...

  2. ACM-ICPC 2018 沈阳赛区网络预赛-K:Supreme Number

    Supreme Number A prime number (or a prime) is a natural number greater than 11 that cannot be formed ...

  3. ACM-ICPC 2018 沈阳赛区网络预赛-D:Made In Heaven(K短路+A*模板)

    Made In Heaven One day in the jail, F·F invites Jolyne Kujo (JOJO in brief) to play tennis with her. ...

  4. 图上两点之间的第k最短路径的长度 ACM-ICPC 2018 沈阳赛区网络预赛 D. Made In Heaven

    131072K   One day in the jail, F·F invites Jolyne Kujo (JOJO in brief) to play tennis with her. Howe ...

  5. ACM-ICPC 2018 沈阳赛区网络预赛 J树分块

    J. Ka Chang Given a rooted tree ( the root is node 11 ) of NN nodes. Initially, each node has zero p ...

  6. ACM-ICPC 2018 沈阳赛区网络预赛 K. Supreme Number

    A prime number (or a prime) is a natural number greater than 11 that cannot be formed by multiplying ...

  7. ACM-ICPC 2018 沈阳赛区网络预赛 F. Fantastic Graph

    "Oh, There is a bipartite graph.""Make it Fantastic." X wants to check whether a ...

  8. Fantastic Graph 2018 沈阳赛区网络预赛 F题

    题意: 二分图 有k条边,我们去选择其中的几条 每选中一条那么此条边的u 和 v的度数就+1,最后使得所有点的度数都在[l, r]这个区间内 , 这就相当于 边流入1,流出1,最后使流量平衡 解析: ...

  9. ACM-ICPC 2018 沈阳赛区网络预赛 F Fantastic Graph(贪心或有源汇上下界网络流)

    https://nanti.jisuanke.com/t/31447 题意 一个二分图,左边N个点,右边M个点,中间K条边,问你是否可以删掉边使得所有点的度数在[L,R]之间 分析 最大流不太会.. ...

随机推荐

  1. CCO2017 Vera and Trail Building 构造+图论

    正解:构造+图论 解题报告: 找了半天才找到的传送门! 先简要表达下题意 一个图上,如果存在(a,b)满足a<b且存在从a到b再回到a的路径,每条道路被经过至多一次,我们称(a,b)为完美点对试 ...

  2. 高并发秒杀系统方案(JSR303参数校验)

    <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring- ...

  3. js-jquery-数组遍历

    一.原生方法支持 1.普通for循环 for(j = 0; j < arr.length; j++) { } 说明:性能很高,但是仍可以优化. 2.优化版for循环[推荐] for(j = 0, ...

  4. python接口自动化-token参数关联登录(二)

    原文地址https://www.cnblogs.com/yoyoketang/p/9098096.html 原文地址https://www.cnblogs.com/yoyoketang/p/68866 ...

  5. Perl的变量及语境(一)

    Perl语言中的大部分语句表达式后都紧接一个分号,分隔不同的Perl语句. perl解释器能一次完成编译和运行这两个动作. perl通过一对反引号"``"来表示运行外部命令. 也可 ...

  6. python 爬取html页面

    #coding=utf-8 import urllib.request def gethtml(url): page=urllib.request.urlopen(url) html=page.rea ...

  7. CAReplicatorLayer

    CAReplicatorLayer CAReplicatorLayer的目的是为了高效生成许多相似的图层.它会绘制一个或多个图层的子图层,并在每个复制体上应用不同的变换.看上去演示能够更加解释这些,我 ...

  8. 获取Android设备的唯一识别码|设备号|序号|UUID

    如何获取一个能唯一标识每台Android设备的序号? 这个问题有很多答案,但是他们中的大部分只在某些情况下有效. 根据测试: 所有的设备都可以返回一个 TelephonyManager.getDevi ...

  9. quartz开源作业调度框架的配置

    quartz开源作业调度框架的job服务实现,Quartz是一个完全由java编写的开源作业调度框架,使用时候需要创建一个实现org.quartz.Job接口的java类,Job接口包含唯一的方法: ...

  10. java接口对接——调用别人接口推送数据

    实际开发中经常会遇到要和其他平台或系统对接的情况,实际操作就是互相调用别人的接口获取或者推送数据, 当我们调用别人接口推送数据时,需要对方给一个接口地址以及接口的规范文档,规范中要包括接口的明确入参及 ...