题目链接:https://www.luogu.org/problemnew/show/P4568

卡了一晚上,算是分层图最短路的模板。注意卡SPFA,所以我写了个SLF优化。

同时 AC400祭!~

#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define ri register
using namespace std;
const int maxn = 200000 + 10;
const int inf = 2147483647;
inline int read()
{
int k=0,f=1;
char c=getchar();
while(!isdigit(c))
{
if(c=='-')f=-1;
c=getchar();
}
while(isdigit(c))
{
k=(k<<1)+(k<<3)+c-48;
c=getchar();
}
return k*f;
}
int n, m, k, s, end, dis[maxn][20];
bool vis[maxn][20];
struct edge{
int from, len, to, next;
}e[maxn<<2];
int head[maxn], cnt = 0;
struct que{
int a, b;
};
deque<que> q;
inline void add(int u, int v, int w)
{
e[++cnt].from = u;
e[cnt].to = v;
e[cnt].len = w;
e[cnt].next = head[u];
head[u] = cnt;
}
inline void SPFA()
{
memset(dis, 127, sizeof(dis));
memset(vis, 0, sizeof(vis));
q.push_back((que){s,0});
dis[s][0] = 0;
vis[s][0] = 1;
while(!q.empty())
{
que now = q.front(); q.pop_front();
vis[now.a][now.b] = 0;
for(ri int i = head[now.a]; i != -1; i = e[i].next)
{
if(dis[e[i].to][now.b] > dis[now.a][now.b] + e[i].len)
{
dis[e[i].to][now.b] = dis[now.a][now.b] + e[i].len;
if(vis[e[i].to][now.b] == 0)
{
vis[e[i].to][now.b] = 1;
if(q.empty() || dis[e[i].to][now.b] > dis[q.front().a][now.b])
q.push_back((que){e[i].to, now.b});
else
q.push_front((que){e[i].to, now.b});
}
}
if(now.b + 1 <= k)
{
if(dis[e[i].to][now.b + 1] > dis[now.a][now.b])
{
dis[e[i].to][now.b + 1] = dis[now.a][now.b];
if(vis[e[i].to][now.b + 1] == 0)
{
vis[e[i].to][now.b + 1] = 1;
if(q.empty() || dis[e[i].to][now.b] > dis[q.front().a][now.b + 1])
q.push_back((que){e[i].to, now.b + 1});
else
q.push_front((que){e[i].to, now.b + 1});
}
}
}
}
}
}
int main()
{
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
memset(head, -1, sizeof(head));
n = read(); m = read(); k = read(); s = read(); end = read();
for(ri int i = 1; i <= m; i++)
{
int u, v, w;
u = read(); v = read(); w = read();
add(u, v, w); add(v, u, w);
}
SPFA();
printf("%d",dis[end][k]);
return 0;
}

最新文章

  1. Linux 下dns的搭建
  2. GO语言学习
  3. 3-python学习——变量
  4. kvm虚似机监控
  5. Apriori 关联算法学习
  6. Google Protocol Buffer
  7. Docker系列(二)组件介绍
  8. CentOS卸载openoffice
  9. 天圆地方&amp;#183; 围棋界的盲棋天才 -- 鲍云
  10. Python基础入门教程
  11. sql: sybase 和 oracle 比较
  12. VMWare安装Centos 6.9
  13. 一些有用的Java参考资料
  14. Python数据挖掘(爬虫强化)
  15. python--第十天总结(线程、进程和协程)
  16. hadoop学习笔记之一步一步部署hadoop分布式集群
  17. 牛客OI周赛7-普及组 解题报告
  18. HDU1069(还是dp基础)
  19. 使用JS伪造Post请求
  20. VC项目程序运行时设置指定目录读取Dll

热门文章

  1. 抱歉最近朋友结婚去浪了几天~未来几天会正常更新.今天带来XML文件解析
  2. 牛客网Java刷题知识点之OSI七层参考模型 和 TCP/IP五层参考模型
  3. flask-restful 请求解析
  4. input 标签和a标签实现超链接的区别
  5. sql查询某字段的相同值
  6. 如何更新maven需要的jar包
  7. 重构指南 - 尽快返回(Return ASAP )
  8. 对象大小对比之Comparable与Comparator
  9. javascript实现数据结构与算法系列
  10. java调用c#dll文件配置