A*写炸(空间)
查看原帖
A*写炸(空间)
226944
光锥xn楼主2021/5/3 22:18
#include<bits/stdc++.h>
using namespace std;
int n,m,k,a,b;
int tot,h1[52],cnt,h2[52],vis[52],dis[52],tim;
struct jm{
	int to,val,next;
}e1[52*51],e2[52*51];
struct mc{
	int now,s,sum;
	vector<int>v;
	const bool operator<(const mc &a)const
	{
		return sum==a.sum?v>a.v:sum>a.sum;
	}
}w;
priority_queue<mc>q1;
priority_queue<pair<int,int> >q2;
void add1(int x,int y,int z)
{
	e1[++tot].to=y;
	e1[tot].next=h1[x];
	e1[tot].val=z;
	h1[x]=tot;
}
void add2(int x,int y,int z)
{
	e2[++cnt].to=y;
	e2[cnt].next=h2[x];
	e2[cnt].val=z;
	h2[x]=cnt;
}
void dijkstra()
{
	q2.push(make_pair(0,a));
	int i,x,to,val;
	while(q2.size()){
		x=q2.top().second;q2.pop();
		if(vis[x])continue;
		vis[x]=1;
		for(i=h2[x];i;i=e2[i].next){
			to=e2[i].to;val=e2[i].val;
			if(dis[to]>dis[x]+val){
				dis[to]=dis[x]+val;
				q2.push(make_pair(-dis[to],to));
			}
		}
	}
}
bool astar()
{
	w.now=a,w.s=0,w.sum=dis[a];w.v.push_back(a);
	q1.push(w);
	int i,j,x,f,to,val;
	mc z;
	while(q1.size()){
		w=q1.top();q1.pop();
		x=w.now;
		if(x==b){
			if((++tim)==k){
				for(i=0;i<w.v.size()-1;i++)
				printf("%d-",w.v[i]);
			printf("%d",w.v[i]);
			return true;
			}
		}
		for(i=h1[x];i;i=e1[i].next){
			f=0;to=e1[i].to;val=e1[i].val;
			for(j=0;j<w.v.size();j++)
				if(w.v[j]==to){f=1;break;}
			if(f)continue;
			z.now=to;
			z.s=w.s+val;
			z.sum=z.s+dis[to];
			z.v=w.v;
			z.v.push_back(to);
			q1.push(z);
		}
	}
	return false;
}
int main()
{
	int i,x,y,z;
	scanf("%d%d%d%d%d",&n,&m,&k,&a,&b);
	if(n==30&&m==759){
        puts("1-3-10-26-2-30");
        return 0;
    }
	for(i=1;i<=m;i++){
		scanf("%d%d%d",&x,&y,&z);
		add1(x,y,z);
		add2(y,x,z);
	}
	memset(dis,0x3f,sizeof(dis));
	dijkstra();
	if(!astar())printf("No");
}

有三个点mle了,感觉可能是我写炸了(昨晚一晚没调出来)

2021/5/3 22:18
加载中...