TLE,求剪枝
  • 板块P1395 会议
  • 楼主jiangyunuo
  • 当前回复5
  • 已保存回复5
  • 发布时间2025/7/30 10:34
  • 上次更新2025/7/30 15:34:55
查看原帖
TLE,求剪枝
1061050
jiangyunuo楼主2025/7/30 10:34
#include<bits/stdc++.h>
using namespace std;
int n,a,b,l[50005],r[50005],ans[50005],tot[50005],deep[50005],x=99999999,y,g;
vector<int>e[50005];
queue<int>q;
bool z[50005];
void dep(int x,int y){
	deep[x]=y;
	z[x]=1; 
	for(int i=0;i<e[x].size();i++){
		if(!z[e[x][i]])dep(e[x][i],y+1);
	}
}
int numl(int x){
	tot[x]=1;
	for(int i=0;i<e[x].size();i++){
		if(deep[x]<deep[e[x][i]]){
			l[x]=l[x]+numl(e[x][i])+tot[e[x][i]];
			tot[x]+=tot[e[x][i]];
		}
	}
	return l[x];
}
int numr(int x){
	z[x]=1;
	tot[x]=1;
    r[x]=0;
	for(int i=0;i<e[x].size();i++){
		if(!z[e[x][i]]){
			r[x]+=numr(e[x][i])+tot[e[x][i]];
			tot[x]+=tot[e[x][i]];
			tot[e[x][i]]=0;
			r[e[x][i]]=0;
		}
	}
	z[x]=0;
	return r[x];
}
int main(){
	cin>>n; 
	for(int i=1;i<n;i++){
		cin>>a>>b;
		e[a].push_back(b);
		e[b].push_back(a);
	}
	dep(1,1);
	numl(1);
	for(int i=1;i<=n;i++){
		ans[i]+=l[i];
	}
	memset(z,0,sizeof(z));
	memset(tot,0,sizeof(tot));
	for(int i=1;i<=n;i++){
		for(int j=0;j<e[i].size();j++){
			if(deep[e[i][j]]>deep[i])z[e[i][j]]=1;
		}
		if(!r[i])numr(i);
		ans[i]+=r[i];
		r[i]=0;
		for(int j=0;j<e[i].size();j++){
			if(deep[e[i][j]]>deep[i])z[e[i][j]]=0;
		}
	}
	for(int i=1;i<=n;i++){
		r[i]=ans[i]-l[i];
	}
	for(int i=1;i<=n;i++){
		if(ans[i]<x){
			x=ans[i];
			y=i;
		}
	}
	cout<<y<<" "<<x<<endl;
	return 0;
}

记录

2025/7/30 10:34
加载中...