poj2449 (第k条最短路)
题意:求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条最短路)的更多相关文章
- poj 3613 经过k条边最短路 floyd+矩阵快速幂
http://poj.org/problem?id=3613 s->t上经过k条边的最短路 先把1000范围的点离散化到200中,然后使用最短路可以使用floyd,由于求的是经过k条路的最短路, ...
- 分层图 (可以选择K条路的权为0,求最短路)
分层图可以处理从图中选取k条边使其边权变为0,求最短路 Description 在你的强力援助下,PCY 成功完成了之前的所有任务,他觉得,现在正是出去浪的大好时光.于是,他来到高速公路上,找到一辆摩 ...
- HDU 4396More lumber is required 过至少K条边的最短路
/* ** 题目要求过最少k条边的最短路 */ #include <iostream> #include <cstdio> #include <cstring> # ...
- POJ 3613 快速幂+Floyd变形(求限制k条路径的最短路)
题意: 给你一个无向图,然后给了一个起点s和终点e,然后问从s到e的最短路是多少,中途有一个限制,那就是必须走k条边,路径可以反复走. 思路: 感觉很赞的一个题目,据说证明是什 ...
- 图论专题训练1-D(K步最短路,矩阵连乘)
题目链接 /* *题目大意: *求出从i到j,刚好经过k条边的最短路; * *矩阵乘法的应用之一(国家队论文): *矩阵乘法不满足交换律,矩阵乘法满足结合律; *给定一个有向图,问从A点恰好走k步(允 ...
- cdoj915-方老师的分身 II (长度不小于k的最短路)【spfa】
http://acm.uestc.edu.cn/#/problem/show/915 方老师的分身 II Time Limit: 10000/5000MS (Java/Others) Memo ...
- poj3613Cow Relays——k边最短路(矩阵快速幂)
题目:http://poj.org/problem?id=3613 题意就是求从起点到终点的一条恰好经过k条边的最短路: floyd+矩阵快速幂,矩阵中的第i行第j列表示从i到j的最短路,矩阵本身代表 ...
- POJ 3613 Cow Relays【k边最短路】
题目链接:http://poj.org/problem?id=3613 题目大意: 给出n头牛,t条有向边,起点以及终点,限制每头牛放在一个点上,(一个点上可以放多头牛),从起点开始进行接力跑到终点, ...
- POJ --- 3613 (K步最短路+矩阵快速幂+floyd)
Cow Relays Description For their physical fitness program, N (2 ≤ N ≤ 1,000,000) cows have decided ...
随机推荐
- 【nodejs】安装browser-sync 遇到错误提示
首先我用的是mac电脑在我执行安装browser-sync时遇到如下问题: 因为不被允许所以我只能不安装全局了: 但是又出现了如下的新问题 纠结了半个小时,终于知道为什么会出现这个问题了, node只 ...
- MSSQL 2000 错误823恢复案例
一.故障描述 MSSQL Server 2000 附加数据库错误823,附加数据库失败.数据库没有备份,不能通过备份恢复数据库,急需恢复数据库中的数据. 二.故障分析SQL Server数据库 823 ...
- linux系统命令学习系列-用户组管理
先复习一下上节内容: 设置密码命令passwd 用户信息修改命令usermod 用户删除命令userdel 作业:修改user1的用户id为505,家目录到admin,用户组为admin,最后删除us ...
- typedef 使用
1,C 语言提供了 typedef 关键字,您可以使用它来为类型取一个新的名字. #include<stdio.h> typedef unsigned char BYTE; int mai ...
- Python进程
(先分享一个Python在线编程的网站http://www.pythontip.com/coding/skulpt-interactive/) (本文为原创作品,欢迎转载,转载请注明出处) 一.概念 ...
- 集合之深入理解HashMap
Hashmap是一种非常常用的.应用广泛的数据类型 1.hashmap的数据结构 要知道hashmap是什么,首先要搞清楚它的数据结构,在java编程语言中,最基本的结构就是两种,一个是数组,另外一个 ...
- 使用java客户端调用redis
Redis支持很多编程语言的客户端,有C.C#.C++.Clojure.Common Lisp.Erlang.Go.Lua.Objective-C.PHP.Ruby.Scala,甚至更时髦的Node. ...
- Vue项目模板--和--webpack自动化构建工具的---项目打包压缩使用
[首先安装node.js]: 1. 从node.js官网下载并安装node,安装过程很简单. 2. npm 版本需要大于 3.0,如果低于此版本需要升级它: # 查看版本 npm -v2.3.0 #升 ...
- STL源码剖析 — 空间配置器(allocator)
前言 以STL的实现角度而言,第一个需要介绍的就是空间配置器,因为整个STL的操作对象都存放在容器之中. 你完全可以实现一个直接向硬件存取空间的allocator. 下面介绍的是SGI STL提供的配 ...
- 线段树(单标记+离散化+扫描线+双标记)+zkw线段树+权值线段树+主席树及一些例题
“队列进出图上的方向 线段树区间修改求出总量 可持久留下的迹象 我们 俯身欣赏” ----<膜你抄> 线段树很早就会写了,但一直没有总结,所以偶尔重写又会懵逼,所以还是要总结一下. ...