题意就是要求第K短的路的长度(S->T)。

对于K短路,朴素想法是bfs,使用优先队列从源点s进行bfs,当第K次遍历到T的时候,就是K短路的长度。

但是这种方法效率太低,会扩展出很多状态,所以考虑用启发式搜索A*算法。

估价函数 = 当前值 + 当前位置到终点的距离,即F(p) = G(p) + H(p)。

G(p): 当前从S到p所走的路径距离

H(p): 当前点p到终点T的最短路径距离   ---可以先将整个图边方向取反然后以T为源点求个最短路,用SPFA提速

F(p): 从S按照当前路径走到p然后走到T一共至少走多远

所以我们结合SPFA+A*可以解决。

注意:当S==T时,需要计算第K+1短路,因为从S->T这条长度为0的路径不能算在内。

还有,SPFA处判了一下负环。SPFA算法中,如果某个点出队次数大于n,说明此处存在负环。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <functional>
#define Mod 1000000007
using namespace std;
#define N 1007 struct node
{
int v;
int g,f; //f = g+h
bool operator < (const node &a)const
{
if(a.f == f)
return a.g < g;
return a.f < f;
}
}; struct Edge
{
int v,w,next;
}G[*N],G2[*N]; int head[*N],head2[*N];
int vis[N],dis[N];
int out[N];
int n,m,K,S,T,tot,tot2; void addedge(Edge *G,int& tot,int *head,int u,int v,int w)
{
G[tot].v = v;
G[tot].w = w;
G[tot].next = head[u];
head[u] = tot++;
} int SPFA(int s,int head[N],Edge G[N],int dis[N])
{
int i;
queue<int> que;
for(i=;i<=n;i++)
dis[i] = Mod;
memset(vis,,sizeof(vis));
memset(out,,sizeof(out));
que.push(s);
vis[s] = ;
dis[s] = ;
while(!que.empty())
{
int now = que.front();
que.pop();
vis[now] = ;
out[now]++;
if(out[now] > n)
return ;
for(int k=head[now];k!=-;k=G[k].next)
{
if(dis[G[k].v] > dis[now] + G[k].w)
{
dis[G[k].v] = dis[now] + G[k].w;
if(!vis[G[k].v])
{
vis[G[k].v] = ;
que.push(G[k].v);
}
}
}
}
return ;
} int A_Star(int head[N],Edge G[N],int dis[N])
{
node tmp,now;
int cnt = ;
priority_queue<node> que;
if(S == T)
K++;
if(dis[S] == Mod)
return -;
tmp.v = S;
tmp.g = ;
tmp.f = tmp.g+dis[S];
que.push(tmp);
while(!que.empty())
{
tmp = que.top();
que.pop();
if(tmp.v == T)
cnt++;
if(cnt == K)
return tmp.g;
for(int i=head[tmp.v];i!=-;i=G[i].next)
{
now.v = G[i].v;
now.g = tmp.g + G[i].w;
now.f = now.g + dis[now.v];
que.push(now);
}
}
return -;
} int main()
{
int i,j,u,v,w;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(head,-,sizeof(head));
memset(head2,-,sizeof(head2));
tot = tot2 = ;
for(i=;i<m;i++)
{
scanf("%d%d%d",&u,&v,&w);
addedge(G,tot,head,u,v,w); //原图
addedge(G2,tot2,head2,v,u,w); //反图
}
scanf("%d%d%d",&S,&T,&K);
if(SPFA(T,head2,G2,dis))
{
int k_len = A_Star(head,G,dis);
printf("%d\n",k_len);
}
else
puts("-1");
}
return ;
}

POJ 2449 Remmarguts' Date --K短路的更多相关文章

  1. poj 2449 Remmarguts' Date K短路+A*

    题目链接:http://poj.org/problem?id=2449 "Good man never makes girls wait or breaks an appointment!& ...

  2. POJ 2449 Remmarguts' Date (K短路 A*算法)

    题目链接 Description "Good man never makes girls wait or breaks an appointment!" said the mand ...

  3. poj 2449 Remmarguts' Date(第K短路问题 Dijkstra+A*)

    http://poj.org/problem?id=2449 Remmarguts' Date Time Limit: 4000MS   Memory Limit: 65536K Total Subm ...

  4. poj 2449 Remmarguts' Date (k短路模板)

    Remmarguts' Date http://poj.org/problem?id=2449 Time Limit: 4000MS   Memory Limit: 65536K Total Subm ...

  5. POJ 2449 - Remmarguts' Date - [第k短路模板题][优先队列BFS]

    题目链接:http://poj.org/problem?id=2449 Time Limit: 4000MS Memory Limit: 65536K Description "Good m ...

  6. 图论(A*算法,K短路) :POJ 2449 Remmarguts' Date

    Remmarguts' Date Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 25216   Accepted: 6882 ...

  7. poj 2449 Remmarguts' Date 第k短路 (最短路变形)

    Remmarguts' Date Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 33606   Accepted: 9116 ...

  8. poj 2449 Remmarguts' Date(K短路,A*算法)

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u013081425/article/details/26729375 http://poj.org/ ...

  9. K短路模板POJ 2449 Remmarguts' Date

      Time Limit: 4000MS   Memory Limit: 65536K Total Submissions:32863   Accepted: 8953 Description &qu ...

随机推荐

  1. 【FFmpeg】ffplay播放rtsp视频流花屏问题

    问题描述:ffplay播放rtsp视频流时,播放过程中随机出现花屏现象. 基本流程学习:阅读ffplay源码,熟悉其播放rtsp视频流的基本流程. 在ffplay源码阅读和分析的基础上,画出了其播放r ...

  2. java service wrapper 级别为info导致内存剧增直至溢出

    上周,公司某一环境发生java service wrapper内存剧增导致最后被自动killed的情况,经过分析,确定导致java service wrapper(后续简称wrapper)守护进程内存 ...

  3. SQL数据库基础(五)

    字符串函数: 时间日期函数: SELECT @@DATEFIRST AS '1st Day', DATEPART(dw, GETDATE()) AS 'Today' SELECT GETDATE() ...

  4. React 初学整理

    1,通过createElement创建元素 HELLO Word ps:切记组建名称首字母大写 2,虚拟DOM 在虚拟DOM上操作 通过render来渲染真是DOM 3,JSX JSX 是对JS的语法 ...

  5. javascript作用域链学习笔记

    作用域链 "JavaScript中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里." --权威指南 在JavaScript中,一切皆对象,包括函数.函数对象和其它对象 ...

  6. idoc 和 bapi 和 rfc 之间的区别

        se37 写出来的叫function,其中可以远程调用的叫rfc,remote-enabled function,abap语法和输入输出参数就会有一些限制.bapi是sap做好的实现特定业务操 ...

  7. MSCRM 2011/2013 单点登录 实现

    通过自定义的ASP.NET程序,输入相关信息后,直接进入MSCRM 2011/2013中.

  8. SharePoint 2013 手动删除爬网项目

    本文介绍如何手动删除某些搜索项目,其实删除搜索项目并不常用,主要还是在刚刚完成爬网,就删除了某些项目,然后有比较敏感需要马上删除的时候.下面,就跟着图文简单了解下手动删除已爬网的项目吧. 1.配置好搜 ...

  9. 桥牌笔记:Skill Level 4 D8

    西拿黑桃K.A后,转攻小方块. 看来只有一个小红桃失张了.飞方块没有必要冒险.但将牌分布4-0时会有点麻烦.

  10. 关于一个软件ipa包的其他图片资源

    有时候 当你打开一个ipa包内容的时候    可能会找不到全部的资源     所以你需要在github上下载一个插件 下载下来以后   运行一下 然后会出来这个 把ipa  文件   拖到里面     ...