A* + dijkstra/spfa

第K短路的模板题,就是直接把最短路当成估价函数,保证估价函数的性质(从当前状态转移的估计值一定不大于实际值)

我们建反图从终点跑最短路,就能求出从各个点到终点的最短距离,这样就能满足估价函数的性质了

要注意一点,当起点和终点一样的时候第k短路就变成k+1短了,因为0也算一条。。。

话说回来为啥我用pair就MLE了呢。。。。

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
inline int lowbit(int x){ return x & (-x); }
inline int read(){
int X = 0, w = 0; char ch = 0;
while(!isdigit(ch)) { w |= ch == '-'; ch = getchar(); }
while(isdigit(ch)) X = (X << 3) + (X << 1) + (ch ^ 48), ch = getchar();
return w ? -X : X;
}
inline int gcd(int a, int b){ return a % b ? gcd(b, a % b) : b; }
inline int lcm(int a, int b){ return a / gcd(a, b) * b; }
template<typename T>
inline T max(T x, T y, T z){ return max(max(x, y), z); }
template<typename T>
inline T min(T x, T y, T z){ return min(min(x, y), z); }
template<typename A, typename B, typename C>
inline A fpow(A x, B p, C yql){
A ans = 1;
for(; p; p >>= 1, x = 1LL * x * x % yql)if(p & 1)ans = 1LL * x * ans % yql;
return ans;
}
const int N = 1005;
int n, m, k, s, t, cnt1, cnt2, head1[N], head2[N], dist[N], num[N], w[N];
bool vis[N];
struct Edge{ int v, next, dis; } edge1[100005], edge2[100005]; struct Point{
int s, dis;
bool operator < (const Point &rhs) const {
return dis > rhs.dis;
}
Point(int s, int dis): s(s), dis(dis){}
}; struct Node{
int v, f, g;
Node(int v, int f, int g): v(v), f(f), g(g){}
bool operator < (const Node &rhs) const{
return f + g > rhs.f + rhs.g;
}
}; void addEdge1(int a, int b, int c){
edge1[cnt1].v = b, edge1[cnt1].next = head1[a], edge1[cnt1].dis = c;
head1[a] = cnt1 ++;
} void addEdge2(int a, int b, int c){
edge2[cnt2].v = b, edge2[cnt2].next = head2[a], edge2[cnt2].dis = c;
head2[a] = cnt2 ++;
} void dijkstra(){
fill(dist, dist + N, INF);
priority_queue<Point> pq;
dist[t] = 0;
pq.push(Point(t, dist[t]));
while(!pq.empty()){
int s = pq.top().s, d = pq.top().dis; pq.pop();
if(vis[s]) continue;
vis[s] = true;
for(int i = head2[s]; i != -1; i = edge2[i].next){
int u = edge2[i].v;
if(dist[u] > d + edge2[i].dis){
dist[u] = d + edge2[i].dis;
pq.push(Point(u, dist[u]));
}
}
}
} int astar(){
if(dist[s] == INF) return -1;
if(s == t) k ++;
priority_queue<Node> pq;
pq.push(Node(s, dist[s], 0));
while(!pq.empty()){
Node cur = pq.top(); pq.pop();
num[cur.v] ++;
if(cur.v == t && num[cur.v] == k) return cur.f + cur.g;
if(num[cur.v] > k) continue;
for(int i = head1[cur.v]; i != -1; i = edge1[i].next){
int u = edge1[i].v;
if(num[u] == k) continue;
pq.push(Node(u, dist[u], cur.g + edge1[i].dis));
}
}
return -1;
} void init(){
cnt1 = cnt2 = 0;
memset(head1, -1, sizeof head1);
memset(head2, -1, sizeof head2);
} int main(){ while(scanf("%d%d", &n, &m) != EOF){
init();
for(int i = 0; i < m; i++){
int a, b, c; scanf("%d%d%d", &a, &b, &c);
addEdge1(a, b, c), addEdge2(b, a, c);
}
scanf("%d%d%d", &s, &t, &k);
dijkstra();
printf("%d\n", astar());
}
return 0;
}

POJ 2449 Remmarguts' Date (算竞进阶习题)的更多相关文章

  1. POJ 1015 Jury Compromise (算竞进阶习题)

    01背包 我们对于这类选或者不选的模型应该先思考能否用01背包来解. 毫无疑问物体的价值可以看成最大的d+p值,那么体积呢?题目的另一个限制条件是d-p的和的绝对值最小,这启发我们把每个物体的d-p的 ...

  2. POJ 2245 Addition Chains(算竞进阶习题)

    迭代加深dfs 每次控制序列的长度,依次加深搜索 有几个剪枝: 优化搜索顺序,从大往下枚举i, j这样能够让序列中的数尽快逼近n 对于不同i,j和可能是相等的,在枚举的时候用过的数肯定不会再被填上所以 ...

  3. poj 2449 Remmarguts' Date(第K短路问题 Dijkstra+A*)

    http://poj.org/problem?id=2449 Remmarguts' Date Time Limit: 4000MS   Memory Limit: 65536K Total Subm ...

  4. poj 2449 Remmarguts' Date (k短路模板)

    Remmarguts' Date http://poj.org/problem?id=2449 Time Limit: 4000MS   Memory Limit: 65536K Total Subm ...

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

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

  6. poj 2449 Remmarguts' Date 第k短路 (最短路变形)

    Remmarguts' Date Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 33606   Accepted: 9116 ...

  7. POJ 2449 Remmarguts' Date (第k短路径)

    Remmarguts' Date Time Limit: 4000MS   Memory Limit: 65536K Total Submissions:35025   Accepted: 9467 ...

  8. POJ 1821 Fence (算竞进阶习题)

    单调队列优化dp 我们把状态定位F[i][j]表示前i个工人涂了前j块木板的最大报酬(中间可以有不涂的木板). 第i个工人不涂的话有两种情况: 那么F[i - 1][j], F[i][j - 1]就成 ...

  9. POJ 3974 Palindrome (算竞进阶习题)

    hash + 二分答案 数据范围肯定不能暴力,所以考虑哈希. 把前缀和后缀都哈希过之后,扫描一边字符串,对每个字符串二分枚举回文串长度,注意要分奇数和偶数 #include <iostream& ...

随机推荐

  1. 每秒高达1.6亿次操作的并发键值存储库 FASTER 诞生

    FASTER 在过去十年中,云中的数据密集型应用程序和服务有了巨大的增长.数据在各种边设施(例如,设备,浏览器和服务器)上创建,并由云应用程序处理用来获得数据价值或做出决策.应用程序和服务可以处理收集 ...

  2. VS2017开发的IDE扩展

    Tag Helpers 智能提示 Razor Language Services: https://marketplace.visualstudio.com/items?itemName=ms-mad ...

  3. Pandas基础使用

    Pandas是基于NumPy的一种工具,该工具是为了解决数据分析任务而创建的. 1.导入pandas import pandas as pd 2.pandas数据类型: 1)Series:一维数据类型 ...

  4. js总结:利用js获取下拉框的value值和文本值

    select下拉框在项目开发中是经常用到的,特别是在联级菜单方面的应用更为广泛.但是,对于一些初学者来说,如何获取下拉框子节点option的value值和文本内容,还是有一点难度的. html代码: ...

  5. 自己实现数据结构系列三---Stack

    一.代码部分 1.定义接口 public interface Stack<E> { int getSize(); boolean isEmpty(); void push(E e); E ...

  6. SpringBoot 4.SpringBoot 整合 devtools 实现热部署

    一.添加 devtools 依赖 <!-- Spring boot 热部署 : 此热部署会遇到 java.lang.ClassCastException 异常 --> <!-- op ...

  7. jackson使用问题:mapper.readValue()将JSON字符串转反序列化为对象失败或异常

    问题根源:转化目标实体类的属性要与被转JSON字符串总的字段 一 一对应!字符串里可以少字段,但绝对不能多字段. 先附上我这段出现了问题的源码: // 1.接收并转化相应的参数.需要在pom.xml中 ...

  8. python学习笔记(10)--组合数据类型(集合类型)

    集合类型 集合是多个元素的无序组合,每个元素唯一,不存在相同类型,每个元素是不可变类型.用{}表示,元素间用逗号分隔.建立结合类型用{},或set函数,如果是空集合必须用set. >>&g ...

  9. 微服务架构中APIGateway原理

    背景 我们知道在微服务架构风格中,一个大应用被拆分成为了多个小的服务系统提供出来,这些小的系统他们可以自成体系,也就是说这些小系统可以拥有自己的数据库,框架甚至语言等,这些小系统通常以提供 Rest ...

  10. elasticsearch索引合并

    参考地址:http://cwiki.apachecn.org/display/Elasticsearch/Reindex+API 1.首先插入准备数据,创建两个索引. (1).PUT  http:// ...