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;
}

posted @ 2025-06-01 17:34  OrangeRED  阅读(16)  评论(0)    收藏  举报