Time Limit: 4000MS | Memory Limit: 65536K | |
Total Submissions: 22412 | Accepted: 6085 |
Description
Input
Output
Sample Input
2 2
1 2 5
2 1 4
1 2 2
Sample Output
14
Source
#include <cstdio> #include <cstring> #include <queue> #include <vector> using namespace std; int const INF = 0xfffffff; int const MAX1 = 1005; int const MAX2 = 1e5 + 5; int dis[MAX1], head[MAX1], head2[MAX1]; int n, m, cnt; bool vis[MAX1]; struct node { int v, w; int next; }e[MAX2], e2[MAX2]; struct node1 { int v, g, f; bool operator < (const node1 &r) const { if(r.f == f) return r.g < g; return r.f < f; } }; void Add(int u, int v, int w) { e[cnt].v = v; e[cnt].w = w; e[cnt].next = head[u]; head[u] = cnt; e2[cnt].v = u; e2[cnt].w = w; e2[cnt].next = head2[v]; head2[v] = cnt++; } bool spfa(int s) { memset(vis, false, sizeof(vis)); dis[s] = 0; queue <int> q; q.push(s); while(!q.empty()) { int cur = q.front(); q.pop(); vis[cur] = false; for(int i = head2[cur]; i != -1; i = e2[i].next) { if(dis[e2[i].v] > dis[cur] + e2[i].w) { dis[e2[i].v] = dis[cur] + e2[i].w; if(!vis[e2[i].v]) { vis[e2[i].v] = true; q.push(e2[i].v); } } } } } int A_star(int s, int t, int k) { if(s == t) k++; if(dis[s] == INF) return -1; priority_queue <node1> q; int num = 0; node1 tmp, to; tmp.v = s; tmp.g = 0; tmp.f = tmp.g + dis[tmp.v]; q.push(tmp); while(!q.empty()) { tmp = q.top(); q.pop(); if(tmp.v == t) num++; if(num == k) return tmp.g; for(int i = head[tmp.v]; i != -1; i = e[i].next) { to.v = e[i].v; to.g = tmp.g + e[i].w; to.f = to.g + dis[to.v]; q.push(to); } } return -1; } int main() { scanf("%d %d", &n, &m); cnt = 0; memset(head, -1, sizeof(head)); memset(head2, -1, sizeof(head2)); for(int i = 0; i < MAX1; i++) dis[i] = INF; while(m--) { int u, v, w; scanf("%d %d %d", &u, &v, &w); Add(u, v, w); } int s, t, k; scanf("%d %d %d", &s, &t, &k); spfa(t); printf("%d\n", A_star(s, t, k)); }
POJ 2449 Remmarguts' Date (第k短路 A*搜索算法模板)
原文地址:http://blog.csdn.net/tc_to_top/article/details/44360343