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( ...
随机推荐
- java 中 的 字节流!
package cn.zhouzhou; import java.io.FileInputStream; import java.io.FileNotFoundException; import ja ...
- Tembin
1:组织机构和用户之间是多对一的关系,一个组织结构可以有多个成员,一个成员只能属于一个组织机构. 2:app里面的邀请成员:是邀请发送短信通知用户注册tembin账户,当用户去注册的时候下面就会显示所 ...
- 文件上传.ashx
using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Runtime ...
- Web API 如何请求基于Basic/Bearer 头的方式 C#
public void SetBasicAuthHeader(WebRequest request, String userName, String userPassword) { string au ...
- poj-2406(kmp水题)
题意:定义一个a*b=字符串a连接字符串b:给你一个字符串s,问你这个字符串最多能用多少个字符串t连接得到:例如:aaaa=4个a构成: 解题思路:kmp水题,next数组除了查找字串以外最广泛的一种 ...
- Nginx 如何处理上游响应的数据
陶辉93 一个非常重要的指令 proxy_buffer_size 指令限制头部响应header最大值 proxy_buffering 指令主要是指 上游服务器是否接受完完整包体在处理 默认是on 也就 ...
- sws_getContext函数参数介绍
原型: SwsContext *sws_getContext(int srcW, int srcH, enum AVPixelFormat srcFormat, int dstW, int dstH, ...
- P1428 小鱼比可爱
P1428 题目描述 人比人,气死人:鱼比鱼,难死鱼.小鱼最近参加了一个“比可爱”比赛,比的是每只鱼的可爱程度.参赛的鱼被从左到右排成一排,头都朝向左边,然后每只鱼会得到一个整数数值,表示这只鱼的可爱 ...
- springMVC整理05--数据校验、格式化 & 其他注解 & 数据绑定流程
1. 数据校验.数据格式化 参考博客 http://www.importnew.com/19477.html 1.1 数据校验 使用 spring 数据校验,先要导入校验器的 jar: <! ...
- Django+Xadmin打造在线教育系统(七)
全局导航&个人中心&全局搜索 配置全局导航 让index页面也继承base页面,注意首页有个单独的__index.js__ base页面的导航栏也进行配置 <nav> &l ...