poj 2449 Remmarguts' Date(第K短路问题 Dijkstra+A*)
http://poj.org/problem?id=2449
| Time Limit: 4000MS | Memory Limit: 65536K | |
| Total Submissions: 18168 | Accepted: 4984 |
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
Source
给定一个图,求起点到终点的第k短路。
分析:先用dijkstra从t反向寻找最短路。然后使用A*算法,把f(i)=g(i) + h(i)。h(i)就是i点到t的最短距离。当某点出队次数达到k次的时候,结果为该点的当前路程+该点到t的最短距离。(我没有判断不连通的情况)
为什么这样做是对的呢?我们这样来思考,如果不实用最短路,而只使用A*那么t第x次出队的结果即为第x短路的距离。继而可以想到,从第一个出队次数达到x的点,沿着最短路走到t,一定是第x短路。
说实话我也没有完全理解。
另外注意s==t的情况,据说k要++,不明白为啥。
这个题用来测第k短路的模板真的再好不过了,累计我wa在这么几个地方:
1.起点和终点是同一点时一定要走,不能输出0;
2.用普通邻接矩阵的话要注意重边的问题(所以强烈推荐邻接表水所有题);
【code】:
/**
Judge Status:Accepted Memory:9252K
Time:204MS Language:G++
Code Length:2590B Author:cj
*/ #include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<string.h> #define N 1005
#define M 200100
#define INF 1000000000
using namespace std; struct Edge
{
int v,next,c;
}edge[M]; struct Nod //A*中的优先队列数据类型
{
int v,d,h;
}; struct Dj //dijkstra中的优先队列数据类型
{
int u,dis;
}; bool operator < (Dj a,Dj b) //dijkstra中的优先对队重载<号
{
return b.dis<a.dis;
} bool operator < (Nod a,Nod b) //A*中的优先队列重载<号
{
return b.h+b.d<a.h+a.d;
} int head[N];
int tail[N];
int dis[N];
int visit[N];
int edge_cnt;
int cnt[N]; void init() //初始化
{
memset(head,-,sizeof(head));
memset(tail,-,sizeof(tail));
edge_cnt = ;
memset(visit,,sizeof(visit));
memset(cnt,,sizeof(cnt));
} void addEdge(int a,int b,int c)
{
edge[edge_cnt].v = b;
edge[edge_cnt].c = c;
edge[edge_cnt].next = head[a];
head[a] = edge_cnt++; //记录起始边 edge[edge_cnt].v = a;
edge[edge_cnt].c = c;
edge[edge_cnt].next = tail[b];
tail[b] = edge_cnt++; //记录结束边
}
void Dijkstra(int n,int t) //对于以各点为起点到t点的最短路径
{
priority_queue<Dj> p_q;
Dj now,temp;
int i;
for(i=;i<=n;i++) dis[i]=INF;
dis[t] = ;
temp.dis = ;
temp.u = t;
p_q.push(temp);
while(!p_q.empty())
{
temp = p_q.top();
p_q.pop();
if(visit[temp.u]) continue;
visit[temp.u] = ;
for(i=tail[temp.u];i!=-;i=edge[i].next)
{
int v = edge[i].v;
if(dis[v]>dis[temp.u]+edge[i].c)
{
dis[v]=dis[temp.u]+edge[i].c;
now.u = v;
now.dis = dis[v];
p_q.push(now);
}
}
}
} int Astar_Kth(int s,int t,int k)
{
Nod cur,nxt;
priority_queue<Nod> p_q;
cur.v = s;
cur.d = ;
cur.h = dis[s];
p_q.push(cur);
while(!p_q.empty())
{
cur = p_q.top();
p_q.pop();
cnt[cur.v]++;
if(cnt[cur.v]>k) continue;
if(cnt[t]==k) return cur.d;
int i;
for(i=head[cur.v];i!=-;i=edge[i].next)
{
int v = edge[i].v;
nxt.d = cur.d + edge[i].c;
nxt.v = v;
nxt.h = dis[v];
p_q.push(nxt);
}
}
return -;
} int main()
{
int n,m;
scanf("%d%d",&n,&m);
int i;
int a,b,c;
init();
for(i=;i<m;i++)
{
scanf("%d%d%d",&a,&b,&c);
addEdge(a,b,c);
}
int s,t,k;
scanf("%d%d%d",&s,&t,&k);
if(s==t) k++;
Dijkstra(n,t);
printf("%d\n",Astar_Kth(s,t,k));
return ;
}
poj 2449 Remmarguts' Date(第K短路问题 Dijkstra+A*)的更多相关文章
- 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短路模板题][优先队列BFS]
题目链接:http://poj.org/problem?id=2449 Time Limit: 4000MS Memory Limit: 65536K Description "Good m ...
- poj 2449 Remmarguts' Date 第k短路 (最短路变形)
Remmarguts' Date Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 33606 Accepted: 9116 ...
- poj 2449 Remmarguts' Date(K短路,A*算法)
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u013081425/article/details/26729375 http://poj.org/ ...
- POJ 2449 Remmarguts' Date ( 第 k 短路 && A*算法 )
题意 : 给出一个有向图.求起点 s 到终点 t 的第 k 短路.不存在则输出 -1 #include<stdio.h> #include<string.h> #include ...
- 【POJ】2449 Remmarguts' Date(k短路)
http://poj.org/problem?id=2449 不会.. 百度学习.. 恩. k短路不难理解的. 结合了a_star的思想.每动一次进行一次估价,然后找最小的(此时的最短路)然后累计到k ...
- 【POJ】2449.Remmarguts' Date(K短路 n log n + k log k + m算法,非A*,论文算法)
题解 (搬运一个原来博客的论文题) 抱着板题的心情去,结果有大坑 就是S == T的时候也一定要走,++K 我发现按照论文写得\(O(n \log n + m + k \ log k)\)算法没有玄学 ...
- poj 2449 Remmarguts' Date K短路+A*
题目链接:http://poj.org/problem?id=2449 "Good man never makes girls wait or breaks an appointment!& ...
- 图论(A*算法,K短路) :POJ 2449 Remmarguts' Date
Remmarguts' Date Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 25216 Accepted: 6882 ...
随机推荐
- 如何更好的理解(pageX,pageY,clientX,clientY,eventX,eventY,scrollX,scrollY,screenX,screenY,event.offsetX,event.offsetY,offsetLeft,style.left)
1 pageX,pageY:鼠标指针相对于当前窗口的X,Y坐标,计算区域包括窗口自身的控件和滚动条.(火狐特有) 2 event.clientX,event.clientY:鼠标指针相对于当前窗口的X ...
- Google Protocol Buffer
Google Protocol Buffer(protobuf)是一种高效且格式可扩展的编码结构化数据的方法.和JSON不同,protobuf支持混合二进制数据,它还有先进的和可扩展的模式支持.pro ...
- 我是如何自学Android,资料分享
我是如何自学Android,资料分享(2015 版) 已经完成,我的建议是先把这一篇看完,再看2015 版的.关于我在学习中开发的项目代码,已经发布在: 爱开发-源码搜索,集成了上万个App源码 ...
- 检测SqlServer服务器CPU是否瓶颈
初次写博文,分享个人心得,欢迎大虾小虾来拍砖. 系统自带的性能监视器 在开始命令框中输入perfmon按enter键即可打开性能监视器 可以通过监视 % Processor Time 的值察看cpu是 ...
- 生成 网站“面包屑” XML
using System; using System.Collections.Generic; using System.IO; using System.Threading; using Syste ...
- C#学习笔记之线程 - 通知Signal
通知事件等待句柄 Signal With EventWaitHandle 事件等待句柄常用于通知.当一个线程等待直到接收到另外一个线程发出的信号.事件等待句柄是最简单的信号结构,它与C#事件无关.有三 ...
- Linux学习三部曲(之三)
今天用linux的时候,想到在windows客户端上传文件到linux服务端. 下面介绍一种方法. 可以通过SecureCRT上传.下载文件(使用sz与rz命令). 1. 安装 lrzsz 在Secu ...
- HTML标签语义化
标签语义化 Web语义化是指使用语义恰当的标签,使页面有良好的结构,页面元素有含义,能够让人和搜索引擎都容易理解. 如果可以在合适的位置使用恰当的标签,那么写出来的页面语义明确,结构清晰,搜索引擎也可 ...
- blazeDS集成spring的remote访问
欢迎交流转载,请注明出处:http://www.cnblogs.com/shizhongtao/p/3490037.html 上一篇我只是简单实用blazeds创建了一个实例,大多数开发中,都是结合 ...
- 暑假集训(4)第三弹 -----递推(Hdu1799)
问题描述:还记得正在努力脱团的小A吗? 他曾经最亲密的战友,趁他绘制贤者法阵期间,暗中设下鬼打墙将小A 围困,并准备破坏小A正在绘制的法阵.小A非常着急.想阻止他的行动.而要阻止他,必须先破解鬼打墙. ...