POJ 2449 Remmarguts' Date (第k短路径)
| Time Limit: 4000MS | Memory Limit: 65536K | |
| Total Submissions:35025 | Accepted: 9467 |
Description
"Prince Remmarguts lives in his kingdom UDF – United Delta of Freedom. One day their neighboring country sent them Princess Uyuw on a diplomatic mission."
"Erenow, the princess sent Remmarguts a letter, informing him that she would come to the hall and hold commercial talks with UDF if and only if the prince go and meet her via the K-th shortest path. (in fact, Uyuw does not want to come at all)"
Being interested in the trade development and such a lovely girl, Prince Remmarguts really became enamored. He needs you - the prime minister's help!
DETAILS: UDF's capital consists of N stations. The hall is numbered S, while the station numbered T denotes prince' current place. M muddy directed sideways connect some of the stations. Remmarguts' path to welcome the princess might include the same station twice or more than twice, even it is the station with number S or T. Different paths with same length will be considered disparate.
Input
The last line consists of three integer numbers S, T and K (1 <= S, T <= N, 1 <= K <= 1000).
Output
Sample Input
2 2
1 2 5
2 1 4
1 2 2
Sample Output
14 思路
或许将其分在最短路不是特别合适,但是暂时就这样吧
此题为第k短路,用到了a*算法
这是一个神奇的算法。用它来求第k小的话,就是用它不断搜索,即使遇到了终点也不停止。
首先我们知道,这个东西本来就是求最短路的一个算法,所以第一次遇到终点,一定是最短路。遇到终点后,如果不停止,那么接下来,在优先队列里面第二靠近终点的肯定会及时补充上。总之,在这个算法里面,
没有vis数组的限制,又将耗费最小的放在前面,所以第二个到达终点的路径就是第二短的了。
或许这样太过于抽象,但是你只需要记住一点,那就是在这个题目里面的A*算法,它的估计值是精确的,因为我们估计值的来源,是对终点反向图的Dijkstra求出来的。正是这个原因,这个算法跑到的每一次终点
,都是准确的第几小。 代码
#include<iostream>
#include<vector>
#include<queue>
#include<cstdio>
#include<algorithm>
using namespace std;
const int inf = 2100000000;
vector<int>u[200024],w[200024];
vector<int>ux[200024],wx[200024];
bool book[200024];
int dis[200024];
int n,m,s,t,k;
struct node
{
int num;
int dis;
bool operator<(const node x)const
{
return dis>x.dis;
}
}; struct aa
{
int num;
int g,f;
bool operator<(const aa x)const
{
if(x.f==f){return x.g<g;}
return x.f<f;
}
}; void Dijkstra()
{
node exa;
fill(dis,dis+n+5,inf);
priority_queue<node>q;
q.push(node{t,0});
dis[t]=0;
while(!q.empty()){
exa=q.top();q.pop();
if(book[exa.num]){continue;}
book[exa.num]=true;
int siz=ux[exa.num].size();
for(int i=0;i<siz;i++){
if(dis[ux[exa.num][i]]>dis[exa.num]+wx[exa.num][i]){
dis[ux[exa.num][i]]=dis[exa.num]+wx[exa.num][i];
q.push(node{ux[exa.num][i],dis[ux[exa.num][i]]});
}
}
}
} int A_star()
{
aa exa;
if(dis[s]==inf){return -1;}
priority_queue<aa>q;
int cnt = 0;
if(s==t){k++;} int r,g,f;
g=0;f=g+dis[s];
q.push(aa{s,g,f});
while(!q.empty()){
exa= q.top();
q.pop();
r=exa.num;
if(r==t){cnt++;}
if(cnt==k){return exa.g;}
int siz=u[r].size();
for(int i=0;i<siz;i++){
g=exa.g+w[r][i];
f=g+dis[u[r][i]];
q.push(aa{u[r][i],g,f});
}
}
return -1;
} int main()
{
scanf("%d%d",&n,&m);
int x,y,z;
for(int i=1;i<=m;i++){
scanf("%d%d%d",&x,&y,&z);
u[x].push_back(y);
w[x].push_back(z);
ux[y].push_back(x);
wx[y].push_back(z);
}
scanf("%d%d%d",&s,&t,&k);
Dijkstra();
printf("%d\n",A_star());
return 0;
}
POJ 2449 Remmarguts' Date (第k短路径)的更多相关文章
- POJ 2449 - Remmarguts' Date - [第k短路模板题][优先队列BFS]
题目链接:http://poj.org/problem?id=2449 Time Limit: 4000MS Memory Limit: 65536K Description "Good m ...
- poj 2449 Remmarguts' Date (k短路模板)
Remmarguts' Date http://poj.org/problem?id=2449 Time Limit: 4000MS Memory Limit: 65536K Total Subm ...
- poj 2449 Remmarguts' Date 第k短路 (最短路变形)
Remmarguts' Date Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 33606 Accepted: 9116 ...
- POJ 2449 Remmarguts' Date ( 第 k 短路 && A*算法 )
题意 : 给出一个有向图.求起点 s 到终点 t 的第 k 短路.不存在则输出 -1 #include<stdio.h> #include<string.h> #include ...
- poj 2449 Remmarguts' Date(K短路,A*算法)
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u013081425/article/details/26729375 http://poj.org/ ...
- poj 2449 Remmarguts' Date(第K短路问题 Dijkstra+A*)
http://poj.org/problem?id=2449 Remmarguts' Date Time Limit: 4000MS Memory Limit: 65536K Total Subm ...
- POJ 2449 Remmarguts' Date --K短路
题意就是要求第K短的路的长度(S->T). 对于K短路,朴素想法是bfs,使用优先队列从源点s进行bfs,当第K次遍历到T的时候,就是K短路的长度. 但是这种方法效率太低,会扩展出很多状态,所以 ...
- 图论(A*算法,K短路) :POJ 2449 Remmarguts' Date
Remmarguts' Date Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 25216 Accepted: 6882 ...
- poj 2449 Remmarguts' Date【第K短路】
题目 题意:求 点s 到 点t 的 第 k 短 路的距离: 估价函数=当前值+当前位置到终点的距离 f(n)=g(n)+h(n); g(n)表示g当前从s到p所走的路径的长度, h( ...
随机推荐
- Navicat软件安装
Navicat_10.1.7永久注册码 NAVH-WK6A-DMVK-DKW3
- $.ajax的async设置true和false的区别一点笔记
async的默认值是true 当async为true时,为异步请求 如果一个$.ajax的函数在另一个函数中调用,不一定会等该函数调用完再加载完函数 导致产生空值的问题 而在JS函数中调用$.ajax ...
- linux 地址解析协议 arp
随便转载,保留出处:http://www.cnblogs.com/aaron-agu/ arp –na #查看 arp –s 123.253.68.209 00:19:56:6F:87:D4 #添加
- html class选择器与id选择器
class选择器: <p class="p1"> .p1{ color:red; ..... } id选择器: <p id="p2"> ...
- 想要配置文件生效 需要通过添加到web.xml加载到内存中
想要配置文件生效 需要通过添加到web.xml加载到内存中
- codeforces158D
Ice Sculptures CodeForces - 158D The Berland University is preparing to celebrate the 256-th anniver ...
- IntelliJ IDEA 导航的 20 大特性
本文由 ImportNew - elviskang 翻译自 dzone.欢迎加入翻译小组.转载请见文末要求. 在前面的文章里,我介绍了IntelliJ IDEA(以下称IntelliJ)中与代码补全及 ...
- BZOJ4482[Jsoi2015]套娃——贪心+set
题目描述 [故事背景] 刚从俄罗斯旅游回来的JYY买了很多很多好看的套娃作为纪念品!比如右 图就是一套他最喜欢的套娃J.JYY由于太过激动,把所有的套娃全 部都打开了.而由于很多套娃长得过于相像,JY ...
- PHP——生成唯一序列号UUID
<?php function uuid($uid = '') { $chars = md5(uniqid(mt_rand(), true)); $uuid = substr($chars, 0, ...
- LOJ2116 [HNOI2015] 开店 【点分治】
题目分析: 观察题目发现度数不小于三,考虑从边分治入手,用点分治代替.将树划分成重心链接的结构,称为点分树.令当前询问的点为$ u $.那么我们考虑点分树的根到$ u $的一条路径.考虑根结点,排除掉 ...