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 ...
随机推荐
- 大神都在看的RxSwift 的完全入坑手册
大神都在看的RxSwift 的完全入坑手册 2015-09-24 18:25 CallMeWhy callmewhy 字号:T | T 我主要是通过项目里的 Rx.playground 进行学习和了解 ...
- Hibernate之深入Hibernate的配置文件
1.创建Configuration类的对象 Configuration类的对象代表了应用程序到SQL数据库的映射配置.Configuration类的实例对象,提供一个buildSessionFacto ...
- nyoj 聪明的kk
聪明的kk 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 聪明的"KK"非洲某国展馆的设计灵感源于富有传奇色彩的沙漠中陡然起伏的沙丘,体现出本国 ...
- jquery实现对div的拖拽功能
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- apacheds的客户端
Apache DS管理的JAVA实现 LdapConnection connection = new LdapNetworkConnection("localhost", 1038 ...
- netty学习--handler传递
在netty中的处理链pipeline中,事件是按顺序传递的,把自己拟人为netty程序,针对进来(inbound)的请求,会从head开始,依次往tail传递. pipeline采用了链表结构,he ...
- python3.6执行pip3时 Unable to create process using '"'
问题需求 由于在windows操作系统中已经安装了python2.7,要在安装python3的时候 将python3.6安装在C:\Python36目录下 然后进入C:\Python36目录下执行pi ...
- .NET Core 2.1 Preview 2发布 - April 10, 2018
我们今天宣布发布 .NET Core 2.1 Preview 2.这也是我们在接下来的两到三个月内接近最终发布的版本,该版本现已准备好进行广泛的测试.我们希望您有任何反馈意见. ASP.NET Cor ...
- Hive函数:rank()、dense_rank()
数据准备: G1,KING, G1,BING, G2,FING, G1,FORD, G2,SCOTT, G1,JONES, G2,BLAKE, G1,CLARK, G1,ALLEN, G1,CELL1 ...
- hdu1072 Nightmare---BFS
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1072 题目大意: 在n×m的地图上,0表示墙,1表示空地,2表示人,3表示目的地,4表示有定时炸弹重 ...