subtesk1 MLE
查看原帖
subtesk1 MLE
708516
AeeE5x楼主2024/7/25 15:14
#include<bits/stdc++.h>
#define ll long long
#define rev(x) reverse(x.begin(),x.end())
using namespace std;
const int maxn=1e5+5,maxm=5e5+5;
struct edge{int to,nxt;ll val;}e[maxm];int head[maxn],cnt=1;
inline void add(int x,int y,ll w){
	e[cnt]=(edge){y,head[x],w};
	head[x]=cnt++;
}
int head_bk[maxn],cnt_bk=1;
inline ll read(){
	ll x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}

struct nod{
	int x;ll val;
	bool operator<(const nod&q)const{return val>q.val;}
};
int n,m,k;
ll ans=0x3f3f3f3f3f3f3f;
int special[maxn];
ll dis[maxn];

inline void dij(){
	priority_queue<nod> que;
	for(int i=0;i<=n+1;i++) dis[i]=0x3f3f3f3f3f3f3f;
	dis[0]=0;
	que.push((nod){0,0});
	while(que.size()){
		nod fr=que.top();que.pop();
		if(fr.x==n+1&&fr.val<ans) ans=fr.val;
		if(fr.val>dis[fr.x]) continue;
		dis[fr.x]=fr.val;
		for(int i=head[fr.x];i;i=e[i].nxt) if(fr.val+e[i].val<dis[e[i].to]) que.push((nod){e[i].to,fr.val+e[i].val});
	}
}


int main(){
	int t=read();
	while(t--){
		for(int i=0;i<=n+1;i++) head[i]=0;
		cnt=1;
		
		n=read(),m=read(),k=read();
		for(int i=1;i<=m;i++){
			int a=read(),b=read();ll c=read();
			add(a,b,c);
		}
		for(int i=1;i<=k;i++) special[i]=read();
		//存档 
		for(int i=0;i<=n+1;i++) head_bk[i]=head[i];
		cnt_bk=cnt;
		for(int bt=0;(n>>bt);bt++){
			//虚拟源点/汇点 
			for(int i=1;i<=k;i++){
				if(((special[i])>>bt)&1) add(0,special[i],0);
				else add(special[i],n+1,0);
			}
			dij();
			//回档 
			for(int i=0;i<=n+1;i++) head[i]=head_bk[i];
			cnt=cnt_bk;
			//虚拟源点/汇点 
			for(int i=1;i<=k;i++){
				if(((special[i])>>bt)&1) add(special[i],n+1,0);
				else add(0,special[i],0);
			}
			dij();
			//回档 
			for(int i=0;i<=n+1;i++) head[i]=head_bk[i];
			cnt=cnt_bk;
		}
		cout<<ans<<endl;
		ans=0x3f3f3f3f3f3f3f;
	}
	return 0;
}

memset都删了啊 怎么还是MLE)

2024/7/25 15:14
加载中...