转载请注明出处: http://www.cnblogs.com/fraud/           ——by fraud

Remmarguts' Date
Time Limit: 4000MS   Memory Limit: 65536K
Total Submissions: 21855   Accepted: 5958

Description

"Good man never makes girls wait or breaks an appointment!" said the mandarin duck father. Softly touching his little ducks' head, he told them a story.

"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 first line contains two integer numbers N and M (1 <= N <= 1000, 0 <= M <= 100000). Stations are numbered from 1 to N. Each of the following M lines contains three integer numbers A, B and T (1 <= A, B <= N, 1 <= T <= 100). It shows that there is a directed sideway from A-th station to B-th station with time T.

The last line consists of three integer numbers S, T and K (1 <= S, T <= N, 1 <= K <= 1000).

Output

A single line consisting of a single integer number: the length (time required) to welcome Princess Uyuw using the K-th shortest path. If K-th shortest path does not exist, you should output "-1" (without quotes) instead.

Sample Input

2 2
1 2 5
2 1 4
1 2 2

Sample Output

14

题意:求第K短路

分析:spfa+A*

先spfa反向求最短路,然后根据A*来搞,f(x)=g(x)+h(x)

h(x)表示从终点反向到x点的最短距离,g(x)表示从起点到x的当前距离,在终点出队K次的时候所求的距离即为第K短路。

即我们每次都优先查找当前总的路程最短的路径,则在终点出队K次之后,即为第k短路了

  1 #include <iostream>
  2 #include <sstream>
  3 #include <ios>
  4 #include <iomanip>
  5 #include <functional>
  6 #include <algorithm>
  7 #include <vector>
  8 #include <string>
  9 #include <list>
 10 #include <queue>
 11 #include <deque>
 12 #include <stack>
 13 #include <set>
 14 #include <map>
 15 #include <cstdio>
 16 #include <cstdlib>
 17 #include <cmath>
 18 #include <cstring>
 19 #include <climits>
 20 #include <cctype>
 21 using namespace std;
 22 #define XINF INT_MAX
 23 #define INF 0x3FFFFFFF
 24 #define MP(X,Y) make_pair(X,Y)
 25 #define PB(X) push_back(X)
 26 #define REP(X,N) for(int X=0;X<N;X++)
 27 #define REP2(X,L,R) for(int X=L;X<=R;X++)
 28 #define DEP(X,R,L) for(int X=R;X>=L;X--)
 29 #define CLR(A,X) memset(A,X,sizeof(A))
 30 #define IT iterator
 31 typedef long long ll;
 32 typedef pair<int,int> PII;
 33 typedef vector<PII> VII;
 34 typedef vector<int> VI;
 35 int s ,t,k;
 36 const int maxn=1010;
 37 vector<PII>G[maxn];
 38 vector<PII>rG[maxn];
 39 int dis[maxn];
 40 int used[maxn];
 41 void init(int n)
 42 {
 43     memset(used,0,sizeof(used));
 44     for(int i=0;i<n;i++)
 45     {
 46         dis[i]=INF;
 47         G[i].clear();
 48         rG[i].clear();
 49     }
 50 }
 51 void add_edge(int u,int v,int w){
 52     G[u].push_back(make_pair(v,w));
 53     rG[v].push_back(make_pair(u,w));
 54 }
 55 void spfa()
 56 {
 57     queue<int>q;
 58     q.push(t);
 59     used[t]=1;
 60     dis[t]=0;
 61     while(!q.empty())
 62     {
 63         int u=q.front();
 64         for(int i=0;i<rG[u].size();i++)
 65         {
 66             int v=rG[u][i].first;
 67             int y=rG[u][i].second;
 68             if(dis[u]+y<dis[v])
 69             {
 70                 dis[v]=dis[u]+y;
 71                 if(!used[v])
 72                 {
 73                     used[v]=1;
 74                     q.push(v);
 75                 }
 76             }
 77         }
 78         q.pop();
 79         used[u]=0;
 80     }
 81 }
 82 int A_star()
 83 {
 84     priority_queue<pair<int,PII>,vector<pair<int,PII> >,greater<pair<int,PII> > >q;
 85     q.push(make_pair(dis[s],make_pair(0,s)));
 86     CLR(used,0);
 87     while(!q.empty())
 88     {
 89         pair<int,PII> p=q.top();
 90         q.pop();
 91         int f=p.first;
 92         int g=p.second.first;
 93         int u=p.second.second;
 94         used[u]++;
 95         if(used[t]==k)return f;
 96         if(used[u]>k)continue;
 97         for(int i=0;i<G[u].size();i++)
 98         {
 99             int v=G[u][i].first;
100             int d=G[u][i].second;
101             q.push(make_pair(g+dis[v]+d,make_pair(g+d,v)));
102         }
103     }
104     return -1;
105 }
106 int main()
107 {
108     ios::sync_with_stdio(false);
109     int n,m;
110     while(cin>>n>>m)
111     {
112         int u,v,w;
113         init(n);
114         for(int i=0;i<m;i++)
115         {
116             cin>>u>>v>>w;
117             add_edge(--u,--v,w);
118         }
119         cin>>s>>t>>k;
120         s--;t--;
121         spfa();
122         if(s==t)k++;
123         cout<<A_star()<<endl;
124     }
125     return 0;
126 }

代码君

转载于:https://www.cnblogs.com/fraud/p/4160419.html

[poj2449]Remmarguts' Date(spfa+A*)相关推荐

  1. poj2449 Remmarguts' Date(第k短路问题)(A*+spfa/dijkstra)

    思路来源 https://blog.csdn.net/berrykanry/article/details/78345894(通俗易懂解释好评) https://www.cnblogs.com/yyf ...

  2. Poj2449 Remmarguts' Date 【A*搜索】K短路

    http://poj.org/problem?id=2449 A*搜索求K短路. #include <cstdio> #include <cstring> #include & ...

  3. POJ 2449 Remmarguts' Date [第k短路]

    Remmarguts' Date Time Limit: 4000MS Memory Limit: 65536KB 64bit IO Format: %lld & %llu Descripti ...

  4. 【POJ】【2449】Remmarguts' Date

    K短路/A* 经(luo)典(ti) K短路题目= = K短路学习:http://www.cnblogs.com/Hilda/p/3226692.html 流程: 先把所有边逆向,做一遍dijkstr ...

  5. POJ - 2449 Remmarguts' Date(第k短路:spfa+A*)

    题目链接:点击查看 题目大意:给出一个有向图,求第k短路 题目分析:偷学了一波A*,本来以为是多难的算法,其实就是bfs+优先队列的升级版,之前看的那些博客写的都太深奥了,以至于看了一半啥都没看懂然后 ...

  6. Remmarguts' Date(POJ2449+最短路+A*算法)

    题目链接:http://poj.org/problem?id=2449 题目: 题意:求有向图两点间的k短路. 思路:最短路+A*算法 代码实现如下: 1 #include <set> 2 ...

  7. poj 2449 Remmarguts' Date 启发式搜索 A*算法

    做这个题算是学了学spfa算法,一开始感觉spfa和dij好像:dij找最小点松弛,spfa就是一个一个的松弛,松到不能松. 求S到T的第K短路 思路:这个算法的思路是从源点S优雅的暴力跑bfs,用优 ...

  8. POJ 2449 Remmarguts' Date(第K短路 + A* + 最短路)题解

    题意:找出第k短路,输出长度,没有输出-1 思路:这题可以用A*做.A*的原理是这样,我们用一个函数:f = g + h 来表示当前点的预期步数,f代表当前点的预期步数,g代表从起点走到当前的步数,h ...

  9. POJ 2449 Remmarguts' Date(k短路模板)

    link:https://vjudge.net/problem/POJ-2449 前面输入与大多最短路题相同 最后一行输入s,t,k 求从s到t的第K短路 wiki link: https://en. ...

  10. POJ 2449 Remmarguts' Date

    POJ_2449 一开始我的思路就是把图上每个点搞一个容量不小于K的最大堆和最小堆,最小堆用于取当前该节点的第某短路值,最大堆用来保存前K小的最短路. 最后为了每次能查询全局最小值,再把N个点放到一个 ...

最新文章

  1. 新冠能被根除吗?医学顶刊BMJ:比根除天花难不少、比脊髓灰质炎容易一点
  2. 三十八、页面分配策略
  3. slider_wap
  4. leetcode算法题--Can I Win
  5. 控制台输入与Math Random的基本使用
  6. hdu1568斐波那契前4位
  7. Baseline needs more love
  8. Repeater控件的分隔线
  9. unity 草 可以一棵棵种吗?_这种野草人称“瓜子金”,1斤能卖50多,拔1棵少棵很珍贵...
  10. 【Java】选择结构排坑指南
  11. [Ext JS6]Microloader - 微加载器
  12. GitHub+Hexo 搭建个人网站
  13. create-react-app 自定义 eslint 配置
  14. 适用于Mac的WinX HD视频转换器:视频转换教程
  15. java listener 原理_Java三大器之监听器(Listener)的工作原理和代码演示
  16. 嵩天老师python123测验_嵩天老师python123测验4: 程序的控制结构 (第4周)
  17. mysql-mmm架构深度详解
  18. 【STM32】Fault 类异常_记一次STM32中HardFault问题的调试解决
  19. 【计蒜客】等边三角形
  20. 十二小时制和二十四小时制之间的区别

热门文章

  1. js文件里获取路由 vue_纯js文件中,怎么使用vue的路由
  2. 跑毒的乌龟-0 : 随机漫步
  3. jsoup html to text,Jsoup和htmlunit结合使用。
  4. Redis Zadd 命令 Redis 有序集合(sorted set)Redis Zadd 命令用于将一个或多个成员元素及其分数值加入到有序集当中。如果某个成员已经是有序集的成员,那么更新
  5. hadoop与hive
  6. 简单机器学习系统的构建以及对于不对称性的分类介绍和性能评价
  7. 建模大师怎么安装到revit中_用协同大师完成Revit协同工作的教程详解
  8. DBPN:Deep Back-Projection Networks For Super-Resolution
  9. 【机器学习系列】EM算法第三讲:由Jensen Inequality推导EM算法
  10. Chapter 1 : MySQL体系结构和搜索引擎