A*求助,MLE,92分
查看原帖
A*求助,MLE,92分
263082
A_zjzj楼主2020/8/24 09:24
#include<cstdio>
#include<queue>
using namespace std;
struct ljb{
	struct edges{
		int to;
		double w;
		int nex;
	}edge[200001];
	int head[5001],k;
	void add(int u,int v,double w){
		edge[++k]=(edges){v,w,head[u]};head[u]=k;
	}
}a,b;
int n,m;
double d[5001];
void spfa(int s){
	queue<int>q;
	q.push(s);
	for(int i=1;i<=n;i++)d[i]=1e17;
	d[s]=0;
	while(!q.empty()){
		int u=q.front();
		q.pop();
		for(int i=b.head[u];i;i=b.edge[i].nex){
			int v=b.edge[i].to;double w=b.edge[i].w;
			if(d[v]>d[u]+w){
				d[v]=d[u]+w;
				q.push(v);
			}
		}
	}
}
double e;
struct zj{
	int now;
	double h,f;
	bool operator < (const zj &x)const{
		return f>x.f;
	}
};
priority_queue<zj>q;
int cnt[5001],ans;
void Astar(int k){
	q.push((zj){1,0,0});
	cnt[1]=1;
	while(!q.empty()){
		zj u=q.top();q.pop();
		if(u.f>e)return;
		if(u.now==n){
			e-=u.f;
			ans++;
			continue;
		}
		for(int i=a.head[u.now];i;i=a.edge[i].nex){
			int v=a.edge[i].to;double w=a.edge[i].w;
			if(cnt[v]<k)q.push((zj){v,u.h+w,u.h+w+d[v]}),cnt[v]++;
		}
	}
}
int main(){
	scanf("%d%d%lf",&n,&m,&e);
	int u,v;
	double w;
	while(m--){
		scanf("%d%d%lf",&u,&v,&w);
		a.add(u,v,w);
		b.add(v,u,w);
	}
	spfa(n);
	Astar(e/d[1]);
	printf("%d",ans);
	return 0;
}

2020/8/24 09:24
加载中...