题解【AcWing178】第K短路
经典的 \(\text{A*}\) 算法例题。
我们可以把估价函数 \(f(i)\) 设置成当前点 \(i\) 到终点 \(t\) 的最短距离,这可以建反图使用 \(\text{Dijkstra}\) 算法预处理出。
然后一遍 \(\text{BFS}\) 即可。
注意当起点与终点相同时要 \(++k\) 。
#include <bits/stdc++.h>
#define DEBUG fprintf(stderr, "Passing [%s] line %d\n", __FUNCTION__, __LINE__)
#define itn int
#define gI gi
using namespace std;
typedef pair <int, int> PII;
typedef pair <int, PII> PIII;
inline int gi()
{
int f = 1, x = 0; char c = getchar();
while (c < '0' || c > '9') {if (c == '-') f = -1; c = getchar();}
while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return f * x;
}
const int maxn = 1003, maxm = 100003;
int s, t, k, n, m;
int tot, head[maxn], ver[maxm * 2], nxt[maxm * 2], edge[maxm * 2], headu[maxn];
int dist[maxn], f[maxn], g[maxn], vis[maxn];
inline void add(int *h, int u, int v, int w)
{
ver[++tot] = v, edge[tot] = w, nxt[tot] = h[u], h[u] = tot;
}
inline void Dijkstra() //预处理估价函数值
{
priority_queue <PII, vector <PII>, greater <PII> > q;
memset(dist, 0x3f, sizeof(dist));
dist[t] = 0;
q.push(make_pair(0, t));
while (!q.empty())
{
int u = q.top().second; q.pop();
if (vis[u]) continue;
vis[u] = 1;
for (int i = headu[u]; i; i = nxt[i])
{
int v = ver[i], w = edge[i];
if (dist[v] > dist[u] + w)
{
dist[v] = dist[u] + w;
q.push(make_pair(dist[v], v));
}
}
}
memcpy(f, dist, sizeof(f));
}
inline int A_star()
{
priority_queue <PIII, vector <PIII>, greater <PIII> > q;
//优先队列中存储 3 个信息:估价函数值、实际距离与当前节点编号
memset(vis, 0, sizeof(vis));
q.push(make_pair(f[s], make_pair(0, s))); //加入起点
while (!q.empty())
{
int now = q.top().second.second, dis = q.top().second.first;
q.pop();
if (vis[now] >= k) continue; //已经搜过了 K 短路
++vis[now];
if (now == t && vis[now] == k) return dis; //找到了结果
for (int i = head[now]; i; i = nxt[i])
{
int v = ver[i], w = edge[i];
if (vis[v] < k)
{
q.push(make_pair(f[v] + dis + w, make_pair(dis + w, v))); //进行扩展
}
}
}
return -1;
}
int main()
{
//freopen(".in", "r", stdin);
//freopen(".out", "w", stdout);
n = gi(), m = gi();
for (int i = 1; i <= m; i+=1)
{
int u = gi(), v = gi(), w = gi();
add(head, u, v, w), add(headu, v, u, w); //建反图
}
s = gi(), t = gi(), k = gi();
if (s == t) ++k;
Dijkstra();
printf("%d\n", A_star());
return 0;
}
题解【AcWing178】第K短路的更多相关文章
- 【USACO Mar08】 奶牛跑步 A-star k短路
Description Bessie准备用从牛棚跑到池塘的方法来锻炼. 但是因为她懒,她只准备沿着下坡的路跑到池塘,然后走回牛棚. Bessie也不想跑得太远,所以她想走最短的路经. 农场上一共有M( ...
- BZOJ1975 [Sdoi2010]魔法猪学院 k短路
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1975 题意概括 给出一个无向图,让你走不同的路径,从1到n,路径长度之和不超过E,求最大路径条数. ...
- ACM-ICPC 2018 沈阳赛区网络预赛 Made In Heaven(K短路)题解
思路:K短路裸题 代码: #include<queue> #include<cstring> #include<set> #include<map> # ...
- POJ 2449 Remmarguts' Date(第K短路 + A* + 最短路)题解
题意:找出第k短路,输出长度,没有输出-1 思路:这题可以用A*做.A*的原理是这样,我们用一个函数:f = g + h 来表示当前点的预期步数,f代表当前点的预期步数,g代表从起点走到当前的步数,h ...
- poj 2449 Remmarguts' Date(第K短路问题 Dijkstra+A*)
http://poj.org/problem?id=2449 Remmarguts' Date Time Limit: 4000MS Memory Limit: 65536K Total Subm ...
- Bzoj 1975: [Sdoi2010]魔法猪学院 dijkstra,堆,A*,K短路
1975: [Sdoi2010]魔法猪学院 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1357 Solved: 446[Submit][Statu ...
- Bzoj 1598: [Usaco2008 Mar]牛跑步 dijkstra,堆,K短路,A*
1598: [Usaco2008 Mar]牛跑步 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 427 Solved: 246[Submit][St ...
- BZOJ1073 [SCOI2007]kshort K短路,A*
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1073 题意概括 以距离为第一关键字,字典序为第二关键字,在所有的从S到T的路径中,选择不重复经过某 ...
- POJ 2449 - Remmarguts' Date - [第k短路模板题][优先队列BFS]
题目链接:http://poj.org/problem?id=2449 Time Limit: 4000MS Memory Limit: 65536K Description "Good m ...
随机推荐
- PTA Is Topological Order
Write a program to test if a give sequence Seq is a topological order of a given graph Graph. Format ...
- codechef Chef at the River
难度 \(hard\) 题意 官方中文题意 做法 设\(G=(V,E)\) 定义1:\(M(G)\)为\(G\)的最小点覆盖 定义2:\(ans(G)\)为\(G\)的题意答案,不考虑船夫 结论1:\ ...
- IDEA 同时打开两个项目,相互引用
- SpringBoot整合持久层技术--(三)Spring Data JPA
简介: JPA(java Persistence API)和SpringData是两个范畴的概念.spring data jpa是spring公司下的spring data项目的一个模块. sprin ...
- MVC开发之注入容器Ninject的使用
背景 在不使用注入容器之前,我们的项目往往存在着大量耦合的类,这使得我们在开发大型项目时难以维护.比如下面这个简单的MVC框架的例子,计算购物车的产品价格总和: /// <summary> ...
- linux基础之IO模型
一.IO模型 一次read操作: (1)等待数据准备好:从磁盘到内核内存 (2)从内核内存复制到进程内存 示意图如下: I/O类型: 同步和异步:synchronous,asynchronous 关注 ...
- 2019年3月最新可用KMS激活服务器地址
更新日期:2019/3/6 kms.03k.org kms.chinancce.com kms.lotro.cc cy2617.jios.org kms.shuax.com kms.luody.inf ...
- P5163 WD与地图 [整体二分,强连通分量,线段树合并]
首先不用说,倒着操作.整体二分来做强连通分量,然后线段树合并,这题就做完了. // powered by c++11 // by Isaunoya #include <bits/stdc++.h ...
- APFS 宗卷 • APFS(加密)磁盘格式怎么去掉?Mac磁盘加密怎么解除?
相信很多朋友都因为APFS 宗卷 • APFS(加密)磁盘格式而困扰,这种磁盘加密,导致很多破解版软件都不能安装.那么磁盘加密怎么解除?小编翻阅了一些教程,为您带来APFS 宗卷 • APFS(加密) ...
- 对于tensorflow中的gradient_override_map函数的理解
# #############添加############## def binarize(self, x): """ Clip and binarize tensor u ...