求第4点数据
查看原帖
求第4点数据
658786
STUDENT00楼主2022/10/31 19:26

哪位大佬能给萌新一下第4点的数据,感激不尽。萌新实在不懂,这么小的数据范围 A* 怎么会MLE。如果有大佬帮我指出 A* 算法的错误或提供了数据,加一小号关注。

#include<bits/stdc++.h>
using namespace std;
int n,m,k,a,b,sum;
vector<pair<int,int> > w[51],g[51];
bool vis[51];
int dis[51];
queue<int> q;
struct node{
	int t,S,F;
	string go;
	void init(int a,int b,string c){
		t=a;
		S=b;
		F=b+dis[a];
		go=c;
	}
	friend bool operator<(node x,node y){
		if(x.F^y.F) return x.F>y.F;
		else return x.go>y.go;
	}
};
priority_queue<node> sq;
void print(string str){
	printf("%d",a);
	for(int i=0;i<str.length();i++) printf("-%d",str[i]);
}
int main(){
	scanf("%d%d%d%d%d",&n,&m,&k,&a,&b);
	while(m--){
		int u,v,l;
		scanf("%d%d%d",&u,&v,&l);
		w[u].push_back(make_pair(v,l));
		g[v].push_back(make_pair(u,l));
	}
	memset(dis,127,sizeof(dis));
	q.push(b);
	vis[b]=1;
	dis[b]=0;
	while(!q.empty()){
		int now=q.front();
		vis[now]=0;
		for(register int i=0;i<g[now].size();i++){
			int t=g[now][i].first,s=dis[now]+g[now][i].second;
			if(dis[t]>s){
				dis[t]=s;
				if(!vis[t]){
					vis[t]=1;
					q.push(t);
				}
			}
		}
		q.pop();
	}
	for(register int i=1;i<=n;i++) sort(w[i].begin(),w[i].end());
	node start;
	start.init(a,0,"");
	sq.push(start);
	while(!sq.empty()){
	    if(sq.size()>10000){
	        printf("No");
	        return 0;
	    }
		node now=sq.top();
		sq.pop();
		int t=now.t,s=now.S;
		string go=now.go;
		if(t==b){
			sum++;
			if(sum==k){
				print(go);
				return 0;
			}
		}else{
			for(register int i=0;i<w[t].size();i++){
				int p=w[t][i].first,r=s+w[t][i].second;
				if(p==a) continue;
				bool flag=0;
				for(register int i=0;i<go.length();i++){
				    if(go[i]==p){
				        flag=1;
				        break;
				    }
				}
				if(flag) continue;
				node o;
				o.init(p,r,go+char(p));
				sq.push(o);
			}
		}
	}
	printf("No");
	return 0;
}

代码如上

2022/10/31 19:26
加载中...