题意:求n个点中,a到b的第k条最短路

思路:

用最短路求出估价函数的h,再在搜索过程中记录g,利用A*求出

最开始想到的便是A*和最短路,但是脑子抽了,居然一个一个去求- -,TL了后才发现可以倒着求最短路一次搞定。

但是又发现没考虑重边的问题,又换了种姿势终于AC,感觉太习惯于直接开二维数组,这不行啊- -

当from = to时,因为还没出发就已经判定k--,所以在其相等时,k+=1

问题:

1.对算法的理解不够透彻- -

2.在题目上考虑不够全面,导致不得不重写代码

#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
#include <functional>
using namespace std;
const int INF = 0x3f3f3f3f;
typedef long long ll;
int vis[1005];
int low[1005];
int head[1005],head1[1005];
int from,to;
int tot;
int n,m,k;
struct edge
{
int u,v;
int len;
int next; //正向
int next1; //反向
edge() {}
edge(int x,int y,int c):u(x),v(y),len(c) {}
};
edge p[100005]; struct node
{
int po;
int g,h;
node() {}
node(int x,int y,int z):po(x),g(y),h(z) {}
bool operator<(const node& a)const
{
return g+h>a.g+a.h;
}
}; void add_edge(int u,int v,int c)
{
p[tot] = edge(u,v,c);
p[tot].next = head[u];
head[u] = tot;
p[tot].next1 = head1[v];
head1[v] = tot++;
} void work(int c) //从to开始找出所有点到to的最短路
{
priority_queue<node>que;
memset(vis,0,sizeof(vis));
for(int i = 1; i <= n; i++)
low[i] = INF;
low[c] = 0;
que.push(node(c,0,0));
while(!que.empty())
{
node cur = que.top();
que.pop();
if(vis[cur.po])
continue;
vis[cur.po] = 1;
for(int i = head1[cur.po]; ~i; i = p[i].next1) //反向查找
{
if(low[p[i].u] > low[cur.po]+p[i].len)
{
low[p[i].u] = low[cur.po] + p[i].len;
que.push(node(p[i].u,0,low[p[i].u]));
}
}
}
} int bfs(int t)
{
int num = 0;
priority_queue<node>que;
node cur;
cur.po = t;
cur.g = 0;
que.push(cur);
while(!que.empty())
{
cur = que.top();
que.pop();
int tp = cur.po;
if(tp == to)
{
num ++;
if(num == k)
{
return cur.g;
}
}
for(int i = head[cur.po]; ~i; i = p[i].next)
{
node tmp;
int x = p[i].v;
tmp.po = x;
tmp.g = cur.g + p[i].len;
tmp.h = low[x];
que.push(tmp);
}
}
return -1;
} void ini()
{
tot = 0;
memset(head,-1,sizeof(head));
memset(head1,-1,sizeof(head1));
} int main()
{
int a,b,len;
while(scanf("%d%d",&n,&m) != EOF)
{
ini(); for(int i = 0; i < m; i++)
{
scanf("%d%d%d",&a,&b,&len);
add_edge(a,b,len);
}
scanf("%d%d%d",&from,&to,&k);
work(to);
if(low[from] == INF) //如果from不能到达to
{
printf("-1\n");
continue;
}
if(from == to)
{
k++;
}
printf("%d\n",bfs(from));
}
return 0;
}

  

poj2449 (第k条最短路)的更多相关文章

  1. poj 3613 经过k条边最短路 floyd+矩阵快速幂

    http://poj.org/problem?id=3613 s->t上经过k条边的最短路 先把1000范围的点离散化到200中,然后使用最短路可以使用floyd,由于求的是经过k条路的最短路, ...

  2. 分层图 (可以选择K条路的权为0,求最短路)

    分层图可以处理从图中选取k条边使其边权变为0,求最短路 Description 在你的强力援助下,PCY 成功完成了之前的所有任务,他觉得,现在正是出去浪的大好时光.于是,他来到高速公路上,找到一辆摩 ...

  3. HDU 4396More lumber is required 过至少K条边的最短路

    /* ** 题目要求过最少k条边的最短路 */ #include <iostream> #include <cstdio> #include <cstring> # ...

  4. POJ 3613 快速幂+Floyd变形(求限制k条路径的最短路)

    题意:       给你一个无向图,然后给了一个起点s和终点e,然后问从s到e的最短路是多少,中途有一个限制,那就是必须走k条边,路径可以反复走. 思路:       感觉很赞的一个题目,据说证明是什 ...

  5. 图论专题训练1-D(K步最短路,矩阵连乘)

    题目链接 /* *题目大意: *求出从i到j,刚好经过k条边的最短路; * *矩阵乘法的应用之一(国家队论文): *矩阵乘法不满足交换律,矩阵乘法满足结合律; *给定一个有向图,问从A点恰好走k步(允 ...

  6. cdoj915-方老师的分身 II (长度不小于k的最短路)【spfa】

    http://acm.uestc.edu.cn/#/problem/show/915 方老师的分身 II Time Limit: 10000/5000MS (Java/Others)     Memo ...

  7. poj3613Cow Relays——k边最短路(矩阵快速幂)

    题目:http://poj.org/problem?id=3613 题意就是求从起点到终点的一条恰好经过k条边的最短路: floyd+矩阵快速幂,矩阵中的第i行第j列表示从i到j的最短路,矩阵本身代表 ...

  8. POJ 3613 Cow Relays【k边最短路】

    题目链接:http://poj.org/problem?id=3613 题目大意: 给出n头牛,t条有向边,起点以及终点,限制每头牛放在一个点上,(一个点上可以放多头牛),从起点开始进行接力跑到终点, ...

  9. POJ --- 3613 (K步最短路+矩阵快速幂+floyd)

    Cow Relays   Description For their physical fitness program, N (2 ≤ N ≤ 1,000,000) cows have decided ...

随机推荐

  1. python简单路由系统

    # 输入模块名/函数 url = input('请输入网址:') module,func = url.split('/') m = __import__('lib.'+module,fromlist= ...

  2. Android 4.4 沉浸式透明状态栏

    原文链接:http://www.bkjia.com/Androidjc/913061.html 第一种方法 这里写代码片第一种方法,在代码设置: if(VERSION.SDK_INT >= VE ...

  3. 【iOS】swift 74个Swift标准库函数

    本文译自 Swift Standard Library: Documented and undocumented built-in functions in the Swift standard li ...

  4. 一、Django的基本用法

    学习Django有一段时间了,整理一下,充当笔记. MVC 大部分开发语言中都有MVC框架 MVC框架的核心思想是:解耦 降低各功能模块之间的耦合性,方便变更,更容易重构代码,最大程度上实现代码的重用 ...

  5. postcss的安装与使用

    我是经过公司另外一个同事推荐的这个 他是一个资深的大哥哥  我觉得我确实需要跟多的学习和成长 而且我觉得我应该听他的话 多学学新知识 最近一直在做适配的网站 会出现很多媒体查询 我发现用这个写媒体查询 ...

  6. CentOS7 防火墙firewalld详细操作

    1.firewalld的基本使用 启动: systemctl start firewalld 查看状态: systemctl status firewalld  停止: systemctl disab ...

  7. ThreadLocal源码分析:(一)set(T value)方法

    在ThreadLocal的get(),set()的时候都会清除线程ThreadLocalMap里所有key为null的value. 而ThreadLocal的remove()方法会先将Entry中对k ...

  8. php的api及登录的权限验证

    类,库,接口(APi),函数,这些概念都是根据问题规模的大小来界定的.一个很小的问题肯定没有必要写成一个库,只需要写几句话就行了. 但是比如一个登录验证,这个功能很强大,很通用,可能前台后台都需要用到 ...

  9. Win7下安装composer, 并使用其安装smarty

    安装composer需要开启PHP openssl扩展. 1) 先查看PHP是否开启了openssl扩展 键盘win+r 输出cmd, 可以看到Dos窗口, 然后执行php -m (需要添加PHP环境 ...

  10. Nginx动静分离架构

    Nginx动静分离简单来说就将动态与静态资源分开,不能理解成只是单纯的把动态页面和静态页面物理分离,严格意义上说应该是动态请求跟静态请求分开,可以理解成使用Nginx处理静态页面,Tomcat,Res ...