关于为什么MLE
  • 板块学术版
  • 楼主Zcras
  • 当前回复7
  • 已保存回复7
  • 发布时间2023/10/30 21:01
  • 上次更新2023/11/2 10:37:55
查看原帖
关于为什么MLE
573977
Zcras楼主2023/10/30 21:01

rt,题目限制125m,但是在数组开到1e2的情况下依旧会mle2个点,求问哪里内存爆了 https://www.luogu.com.cn/record/132505429

#include<bits/stdc++.h>
using namespace std;
const int N=1e2+10,M=N<<1;
int n,k,x,y,z;
int h[N],e[M],w[M],ne[M],idx;
int f[N],fa[N],ans;
bool vis[N];
struct node{
	int dis,num;
};
void add(int x,int y,int z){
	e[++idx]=y;
	w[idx]=z;
	ne[idx]=h[x];
	h[x]=idx;
}
node bfs(int s,int flag){
	memset(vis,0,sizeof vis);
	queue<node>q;
	q.push((node){s,0});
	int maxt,maxn;
	node ns;
	vis[s]=1;
	while(!q.empty()){
		ns=q.front();
		q.pop();
		int u=ns.num;
		if(ns.dis>maxt){
			maxt=ns.dis;
			maxn=ns.num;
		}
		for(int i=h[u];i;i=ne[i]){
			int v=e[i];
			if(!vis[v]){
				vis[v]=1;
				q.push((node){ns.dis+w[i],v});
				if(flag)fa[v]=u;
			}
		}
	}
	return (node){maxt,maxn};
}
int dfs(int u,int fa){
	for(int i=h[u];i;i=ne[i]){
		int v=e[i];
		if(v!=fa){
			dfs(y,x);
			if(ans<f[x]+f[y]+w[i]){
				ans=f[x]+f[y]+w[i];
			}
			f[x]=max(f[x],f[y]+w[i]);
		}
	}
	return ans;
}
void change(int x){
	while(f[x]){
		int u=f[x];
		for(int i=h[u];i;i=ne[i]){
			if(e[i]==x){
				w[i]=-1;
				break;
			}
		}
		for(int i=h[x];i;i=ne[i]){
			if(e[i]==u){
				w[i]=-1;
				break;
			}
		}
		x=u;
	}
}
int main(){
	cin>>n>>k;
	for(int i=1;i<=n-1;i++){
		cin>>x>>y;
		add(x,y,1);
		add(y,x,1);
	}
	node b1=bfs(1,0);
	node b2=bfs(b1.num,1);
	int d1=b2.dis;
	int d2=1;
	change(b1.num);
	if(k==2){
		d2=dfs(1,0);
		cout<<2*n-d1-d2<<endl;
	}else{
		cout<<2*n-d1+1<<endl;
	}
	return 0;
}
2023/10/30 21:01
加载中...