50分MLE求助
查看原帖
50分MLE求助
763540
Silence_nk_zht楼主2024/7/26 15:33

我P1099没有MLE为什么这道题MLE了,而且空间范围还是一样的

#include<iostream>
#define ll long long
using namespace std;
int n,m,start,cnt;
int next1[500010],last[500010],end1[500010];
int edge[500010],pre[500010],dist[500010],flag[500010]; 
void add(int x,int y,int z){
	end1[++cnt]=y;
	edge[cnt]=z;
	next1[cnt]=last[x];
	last[x]=cnt;
}	
void dfs(int now,int father){
	pre[now]=father;
	if(dist[now]>dist[start])start=now;
	for(int i=last[now];i;i=next1[i]){
		int v=end1[i];
		if(v==father || flag[v])continue;
		dist[v]=dist[now]+edge[i];
		dfs(v,now);
	} 
}
int solve(int s){
	int res=0,ans=0x3f3f3f3f;
	for(int i=s,j=s;i;i=pre[i]){
		while(pre[j] && dist[i]-dist[pre[j]]<=m){
			j=pre[j];
		}
		res=max((dist[s]-dist[i]),dist[j]);
		ans=min(res,ans);
	}
	for(int i=s;i;i=pre[i]){
		flag[i]=1;
	}
	for(int i=s;i;i=pre[i]){
		start=i;
		dist[i]=0;		
		dfs(i,pre[i]);
		ans=max(ans,dist[start]);
	}
	return ans;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<n;i++){
		int x,y,z;
		scanf("%d%d%d",&x,&y,&z);
		add(x,y,z);
		add(y,x,z);
	}
	dist[1]=1;
	dfs(1,0);
	dist[start]=0;
	dfs(start,0);
	printf("%d",solve(start));
	return 0;
}
2024/7/26 15:33
加载中...