POJ 2449 Remmarguts' Date
POJ 2449 Remmarguts' Date
\(A*\)算法定义了一个对当前状态 \(x\) 的估价函数
\[f(x) = g(x) + h(x)
\]
\(f(x)\)为排序关键字,在小根堆中体现
\(g(x)\)为从起点开始搜索时走过的路径长度
\(h(x)\)为预先跑一遍\(dijkstra/SPFA\)处理的从终点的最短路
以下为\(SPFA\)代码实现,蒟蒻代码,请多指教~
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
const int N = 1005;
struct node{
int v,w;
};
vector<node> g[N],antig[N];
int n,m,k,ss,tt,x,y,z;
//SPFA模板
int dis[N],vis[N];
void SPFA(int start){
memset(dis,0x7f,sizeof(dis));
queue<int> q;
q.push(start);
dis[start] = 0,vis[start] = 1;
while(!q.empty()){
int t = q.front();
q.pop();
vis[t] = 0;
for(int i=0;i<antig[t].size();i++){
node e = antig[t][i];
if(dis[e.v]>dis[t]+e.w){
dis[e.v] = dis[t]+e.w;
if(!vis[e.v]){
q.push(e.v);
vis[e.v] = 1;
}
}
}
}
}
//A_STAR(A*)
struct Astar_node{
int u,prepath,sufpath;
friend bool operator<(Astar_node x,Astar_node y){
return x.prepath + x.sufpath>y.prepath + y.sufpath;
}
};
int tim[N];//访问次数
int Astar(){
priority_queue<Astar_node> Q;
Q.push(Astar_node{ss,0,dis[ss]});
while(!Q.empty()){
Astar_node t = Q.top();
Q.pop();
tim[t.u]++;
if(t.u==tt && tim[t.u]==k) return t.prepath+t.sufpath;
for(int i=0;i<g[t.u].size();i++){
node e = g[t.u][i];
Q.push(Astar_node{e.v,t.prepath+e.w,dis[e.v]});
}
}
return -1;
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>x>>y>>z;
g[x].push_back({y,z});
antig[y].push_back({x,z});
}
cin>>ss>>tt>>k;
SPFA(tt);//反图
if(ss==tt) k++;
cout<<Astar();
return 0;
}

浙公网安备 33010602011771号