POJ 2449 第k短路

链接:

http://poj.org/problem?id=2449

题意:

给出起点与终点,找出从起点到终点的第k短路,如果起点与终点相同,也要出去走一圈才能算最短路。

题解:

利用A*算法,首先求出其他点到t的最短路径,然后用基于BFS的优先队列A*算法求f(i)=g(i)+h(i),

其中h(i)表示i到t的最短路,g(i)表示从s到i的路径长度每次取出f(i)值最小的,当第k次取出t时即求出第k短路

代码:

31 int n, m, s, t, k;
32 struct edge { int to, cost; };
33 vector<edge> G[MAXN];
34 vector<edge> rG[MAXN];
35 int d[MAXN];
36
37 void dijkstra(int s) {
38     priority_queue<PII, vector<PII>, greater<PII> > que;
39     memset(d, 0x3f, sizeof(d));
40     d[s] = 0;
41     que.push(mp(0, s));
42     while (!que.empty()) {
43         PII p = que.top(); que.pop();
44         int v = p.second;
45         if (d[v] < p.first) continue;
46         rep(i, 0, rG[v].size()) {
47             edge e = rG[v][i];
48             if (d[e.to] > d[v] + e.cost) {
49                 d[e.to] = d[v] + e.cost;
50                 que.push(mp(d[e.to], e.to));
51             }
52         }
53     }
54 }
55
56 struct node {
57     int v, c;
58     const bool operator<(const node &t) const {
59         return c + d[v] > t.c + d[t.v];
60     }
61 };
62
63 int a_star(int s) {
64     priority_queue<node> que;
65     que.push(node{ s, 0 }); k--;
66     while (!que.empty()) {
67         node p = que.top(); que.pop();
68         int v = p.v;
69         if (v == t) {
70             if (k) k--;
71             else return p.c;
72         }
73         rep(i, 0, G[v].size()) {
74             edge e = G[v][i];
75             que.push(node{ e.to,e.cost + p.c });
76         }
77     }
78     return -1;
79 }
80
81 int main() {
82     ios::sync_with_stdio(false), cin.tie(0);
83     cin >> n >> m;
84     while (m--) {
85         int a, b, t;
86         cin >> a >> b >> t;
87         G[a].pb(edge{ b,t });
88         rG[b].pb(edge{ a,t });
89     }
90     cin >> s >> t >> k;
91     dijkstra(t);
92     if (d[s] == INF) cout << -1 << endl;
93     else {
94         if (s == t) k++;
95         cout << a_star(s) << endl;
96     }
97     return 0;
98 }
时间: 2024-11-05 16:04:46

POJ 2449 第k短路的相关文章

POJ 2449Remmarguts&#39; Date K短路模板 A*+SPFA

太水了我不想说了,模板在这里 14312K 313MS 1 #include<queue> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 int v[100010],v2[100010],c[100010],c2[100010],s,t,k,duin; 7 int n,m,point[1010],next[100010],cnt=0,

图论(A*算法,K短路) :POJ 2449 Remmarguts&#39; Date

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

poj 2449 Remmarguts&#39; Date k短路

/*poj 2449 k短路 A* 估价函数是 s到i的距离+i到t的距离 */ #include<cstdio> #include<queue> #include<vector> #define inf 1e7 #define maxn 100010 using namespace std; int n,m,S,T,K,num1,num2,head1[maxn],head2[maxn],dis[maxn]; int q[maxn],hea,tai,f[maxn],cn

【POJ】2449 Remmarguts&#39; Date(k短路)

http://poj.org/problem?id=2449 不会.. 百度学习.. 恩. k短路不难理解的. 结合了a_star的思想.每动一次进行一次估价,然后找最小的(此时的最短路)然后累计到k 首先我们建反向边,跑一次从汇到源的最短路,将跑出来的最短路作为估价函数h 根据f=g+h 我们将源s先走,此时实际价值g为0,估价为最短路(他们的和就是s-t的最短路) 将所有s所连的边都做相同的处理,加入到堆中(假设此时到达的点为x,那么x的g等于s到这个点的边权,因为根据最优,g+h此时是从x

POJ 2449 Remmarguts&#39; Date (第k短路 A*搜索算法模板)

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

POJ 2449 Remmarguts&#39; Date ( Dijkstra + A* 求解第K短路 )

#include <iostream> #include <cstring> #include <queue> #include <fstream> using namespace std; #define E 100005 #define V 1005 #define INF 1 << 30 int heads[V], r_heads[V]; int dists[V]; bool visits[V]; int nEdgeNum, nNodeNu

poj 2449 Remmarguts&#39; Date(K短路,A*算法)

http://poj.org/problem?id=2449 大致题意:给出一个有向图,求从起点到终点的第K短路. K短路与A*算法详解  学长的博客... 算法过程 #include <stdio.h> #include <iostream> #include <algorithm> #include <set> #include <map> #include <vector> #include <math.h> #in

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 2449 求第K短路

第一道第K短路的题目 QAQ 拿裸的DIJKSTRA + 不断扩展的A* 给2000MS过了 题意:大意是 有N个station 要求从s点到t点 的第k短路 (不过我看题意说的好像是从t到s 可能是出题人写错了) 从这题中还真的学到了很多1.第k短路的算法 A* 还有用边表实现dij (注:以下部份资料来源于网上)所谓A*就是启发是搜索 说白了就是给搜索一个顺序使得搜索更加合理减少无谓的搜索. 如何来确定搜索的顺序?..也就是用一个值来表示 这个值为f[n]..每次搜索取f[x]最小的拓展 那