#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
const int inf = 99999999;
const int M = 1005;
int dist[M];
int vist[M];
int num[M];
struct node {
int u;
int w;
node (int uu, int ww): u(uu), w(ww){} //初始化结构体中元素。
};
struct Node {
int u;
int len;
Node (int uu, int ww): u(uu), len(ww){}
friend bool operator <(Node a, Node b) {
return a.len + dist[a.u] > b.len + dist[b.u]; //这里很关键,
//此点到起点的距离和给点到终点的距离,和相对小时入队列,
运用了启发式收索,
}
};
vector<node>g[M], rg[M];
int n, m, k, s, e;
void spfa(int v) {
for(int i = 0; i <= n; i++) {
dist[i] = inf;
vist[i] = 0;
}
dist[v] = 0;
queue<int>que;
que.push(v);
while(!que.empty()) {
int v = que.front();
que.pop();
vist[v] = 0;
for(int i = 0; i < rg[v].size(); i++) {
node p = rg[v][i];
if(dist[p.u] > dist[v] + p.w) {
dist[p.u] = dist[v] + p.w;
if(!vist[p.u]) {
que.push(p.u);
vist[p.u] = 1;
}
}
}
}
}
int A_star(int s) {
if(dist[s] == inf)
return -1;
memset(num, 0, sizeof(num));
priority_queue<Node> que;
que.push(Node(s, 0));
while(!que.empty()) {
Node p = que.top();
que.pop();
int u = p.u;
int len = p.len;
num[u]++;
if(num[e] == k)
return len;
for(int i = 0; i < g[u].size(); i++) {
node q = g[u][i];
que.push(Node(q.u,len+q.w));
}
}
return -1;
}
int main()
{
int x, y, d;
while(scanf("%d%d", &n, &m)!= EOF) {
for(int i = 0; i <= n; i++) {
g[i].clear();
rg[i].clear();
}
for(int i = 1; i <= m; i++) {
scanf("%d%d%d", &x, &y, &d);
g[x].push_back(node(y, d));
rg[y].push_back(node(x, d)); //建立反图,
}
scanf("%d%d%d", &s, &e, &k);
if(s == e)
k++;
spfa(e);
int ans = A_star(s);
printf("%d\n",ans);
}
return 0;
}
poj2449 (重要)优先队列
最新推荐文章于 2021-04-15 18:29:42 发布