60pts MLE求优化
查看原帖
60pts MLE求优化
1420231
dyy0707楼主2024/9/19 15:05

改到90就行

#include<bits/stdc++.h>
#include<ext/pb_ds/priority_queue.hpp>
using namespace std;
struct graph{
	private:
		struct edge{int to,w;bool operator<(edge b)const{return to==b.to?w<b.w:to<b.to;}};
		vector<vector<edge> >g;
	public:
		graph(){memset(this,0,sizeof(this));}
		graph(int n){g.resize(n+1);}
		void push(int u,int v,int w){g[u].push_back({v,w});}
		vector<edge>&edge(int i){return g[i];}
};int n,m,k,a,b;int dis[51];
struct dijnode{int u;int g;bool operator<(dijnode b)const{return b.g+dis[b.u]<g+dis[u];}};
struct node{
	int u;int g;basic_string<int>p;long long b;
	bool operator<(node b)const{
		if(b.g+dis[b.u]!=g+dis[u])return b.g+dis[b.u]<g+dis[u];
		return b.p<p;
	}
};void dijkstra(graph g,int s,int*dis){
	memset(dis,0x3f,sizeof(dis));
	priority_queue<dijnode>q;
	dis[s]=0;q.push({0,s});
	while(!q.empty()){
		int u=q.top().u;
		if(q.top().g>dis[u]){q.pop();continue;}
		q.pop();
		for(auto e:g.edge(u)){
			if(dis[e.to]>dis[u]+e.w){
				dis[e.to]=dis[u]+e.w;
				q.push({dis[e.to],e.to});
			}
		}
	}
}void astar(graph g,int s,int t,int k){
	priority_queue<node>q;
	q.push({s,0,{s},(1ll<<s)});int res=0;
	while(!q.empty()){
		int u=q.top().u;int d=q.top().g;
		basic_string<int>p=q.top().p;long long b=q.top().b;
		if(u==t)res++;
		if(res==k){
			cout<<p[0];
			for(int i=1;i<p.size();i++)cout<<'-'<<p[i];
			return;
		}q.pop();
		for(auto e:g.edge(u)){
			int v=e.to,w=e.w;
			if(!((b>>v)&1)){
				p.push_back(v);b+=(1ll<<v);
				q.push({v,d+w,p,b});
				b-=(1ll<<v);p.pop_back();
			}
		}
	}cout<<"No";
}int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n>>m>>k>>a>>b;graph g(n),h(n);
	for(int u,v,w;m--;){
		cin>>u>>v>>w;
		g.push(u,v,w);
		h.push(v,u,w);
	}for(int i=1;i<=n;i++)sort(g.edge(i).begin(),g.edge(i).end());
	dijkstra(h,1,dis);
	astar(g,a,b,k);
}
2024/9/19 15:05
加载中...