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( ...
随机推荐
- PHP通过循环给数组赋值
$userDatas = [ ['user_id'=>1], ['user_id'=>3] ]; $userIds = []; foreach ($userDatas as $item){ ...
- Lodop打印控件不打印css背景图怎么办
background:url()这是css背景图,http协议会按异步方式下载背景图,所以很容易等不到下载完毕就开始打印了,故lodop不打印css背景图.Lodop不打印css背景图,但是有其他方法 ...
- SQL 给视图赋权限
授予表权限 创建视图 授予视图权限 测试权限 复杂程度: 初级 数据要求: 使用自备的数据 您可以使用 SQL 在企业级地理数据库中创建表和要素类的视图. 本主题中的示例显示如何使用 Microsof ...
- 皮皮虾FAQ
我们提供的软件,是市场上比较好操作的,如果有其他的软件也是可以使用我们的ip的 Windows 1.windows找不到粘贴的地方 window打开窗口后,请在屏幕右下角找小飞机,右键即可 2.win ...
- 【题解】Hanoi
题目描述 有三根柱A,B,C.在柱A上有N块盘片,所有盘片都是大的在下面,小片能放在大片上面.并依次编好序号,现要将A上的N块片移到C柱上,每次只能移动一片,而且在同一根柱子上必须保持上面的盘片比下面 ...
- Linux 部署KVM虚拟化平台
简单介绍 KVM 是基于虚拟化扩展(Intel VT 或者 AMD-V)的 X86 硬件的开源的 Linux 原生的全虚拟化解决方案.KVM 中,虚拟机被实现为常规的 Linux 进程,由标准 Lin ...
- 【BZOJ3816】【清华集训2014】矩阵变换 稳定婚姻问题
题目描述 给出一个\(n\)行\(m\)列的矩阵\(A\), 保证满足以下性质: 1.\(m>n\). 2.矩阵中每个数都是\([0,n]\)中的自然数. 3.每行中,\([1,n]\)中每个自 ...
- vscode跳转到函数定义处
需要安装对应语言的插件,帮助-欢迎使用,安装javascript, php php还需要安装php7, 到官网https://windows.php.net/download#php-7.2 下载解压 ...
- 用webpack2.0构建vue2.0单文件组件超级详细精简实例
npm init -y 初始化项目 //-y 为自动生成package.json,如果需要自行配置,去掉-y即可 安装各种依赖项 npm install --save vue 安装vue2.0 np ...
- linux中$#,$0,$1,$2,$@,$*,$$,$?的含义
$# 是传给脚本的参数个数$0 是脚本本身的文件名$1 是脚本后接的第一个参数$2 是脚本后接的第二个参数$@ 是传给脚本的所有参数列表,"$1" "$2" & ...