| 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