[poj2449]Remmarguts' Date(spfa+A*)

转载请注明出处: 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 }

代码君

[poj2449]Remmarguts' Date(spfa+A*)

时间: 2024-10-08 07:46:00

[poj2449]Remmarguts' Date(spfa+A*)的相关文章

poj2449 Remmarguts&#39; Date,第K短路

点击打开链接 SPFA  + A* #include <cstdio> #include <queue> #include <cstring> #include <algorithm> using namespace std; struct node { int v, dis, f, next; friend bool operator <(node a, node b){ return a.f>b.f; } }; const int INF =

POJ2449 Remmarguts&#39; Date

题目链接:http://poj.org/problem?id=2449 题目描述: 其实题目的大意就是求 第k短路, 存在就输出, 不存在就输出-1. 注意当起点和终点一致的时候,需要k++, 因为在OUTPUT时提到the length (time required) to welcome Princess Uyuw using the K-th shortest path. 可以看出是需要时间的,并且并没有描述相同点直接的时间为0这一条件,因此在计算路径的时候,为0的路径是不能够算到里面的:

POJ2449 Remmarguts&#39; Date 【k短路】

Remmarguts' Date Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 21064   Accepted: 5736 Description "Good man never makes girls wait or breaks an appointment!" said the mandarin duck father. Softly touching his little ducks' head, h

[poj2449]Remmarguts&#39; Date(K短路模板题,A*算法)

解题关键:k短路模板题,A*算法解决. #include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<iostream> #include<cmath> #include<queue> using namespace std; typedef long long ll; const int N=1e3+10; const

POJ2449 Remmarguts&#39; Date 第K短路

POJ2449 比较裸的K短路问题 K短路听起来高大上 实际思路并不复杂 首先对终点t到其他所有点求最短路 即为dist[] 然后由起点s 根据当前走过的距离+dist[]进行A*搜索 第k次到达t即为第K短路 代码也很简单 //数组开的不够 不一定是运行时错误! 可能也会WA #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath&g

【poj2449】 Remmarguts&#39; Date

http://poj.org/problem?id=2449 (题目链接) 题意 求有向图K短路. Solution A*.g(x)为当前节点到起点的步数,h(x)为当前节点到终点的最短距离(也就是估价函数). 细节 dijkstra求终点到各点最短路时要把边反向.原来起点和终点可以是同一个点,坑死了... 代码 // poj2499 #include<algorithm> #include<iostream> #include<cstdlib> #include<

poj 2449 Remmarguts&#39; Date A*+spfa求第k短路

题意: 经典的第k短路,A*算法的经典应用之一. 分析: A*,已走的路程g+到终点的最短距离为启发函数,搜索过程中不判重,第k次到t节点时就求出了第k短路. 代码: //poj 2449 //sep9 #include <iostream> #include <queue> using namespace std; const int maxN=1024; const int maxM=100024; int n,m,s,t,k,e,ne; int head[maxN],nhea

POJ 2448(K短路,A*+SPFA) Remmarguts&#39; Date

题意 给一个n个点m条边的图,然后给一个起点和一个终点,求起点到终点的第K短路. 思路 求第K短路.一个经典的问题. SPFA+A* 核心思想在A*搜索的估计函数的建立上. F(x) = g(x) + h(x) 估价函数 = s到x的距离 + x到t的距离 估价函数的含义就是经过x这个点的路径的距离. 我们在搜索的时候每次选择估价函数较小的值,进行拓展.这样我们搜索到t点的状态出来顺序就是,最短路-次短路-.第三短路- 就减少了我们搜索的状态数. 代码实现上,实现一个估价函数的结构体,然后是实现

poj 2449 Remmarguts&#39; Date 【SPFA+Astar】【经典】

题目:poj 2449 Remmarguts' Date 题意:给出一个图,求k短路. 算法:SPFA求最短路 + AStar 下面引用大牛的分析: 首先,为了说话方便,列出一些术语: 在启发式搜索中,对于每个状态 x,启发函数 f(x) 通常是这样的形式: f(x) = g(x) + h(x) 其中 g(x) 是从初始状态走到 x 所花的代价:h(x) 是从 x 走到目标状态所需要的代价的估计值. 相对于 h(x),还有一个概念叫 h*(x),表示从 x 走到目标状态所需要的实际最小代价(当然