社区讨论

P5536核心城市98分#6WA求条

题目总版参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@m5yw06on
此快照首次捕获于
2025/01/16 13:25
去年
此快照最后确认于
2025/11/04 11:31
4 个月前
查看原帖
除了#6WA了,其他全A。
直径用了BFS,求离核心城市距离用了DFS。
C
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<ll> edge[100001];
ll center;
ll n,dsize;
ll dl[100001];//直径
ll d1=1,d2=1,d1n,d2n,mfn;
ll fl[100001];//每个点离中心的距离
ll bl[100001];//每个点最远的点
ll bir[100001];//每个点离最远的叶节点的距离
struct ptinfo{
	ll num;
	ll p;
	ll sum;
};
void lfd(){
	queue<ptinfo>pt;
	pt.push({1,1,1});//sum为当前的层数
	while(!pt.empty()){
		ptinfo head=pt.front();
		if(head.sum>d1n){//如果可以为最远端点
			d1n=head.sum;
			d1=head.num;
		}
		for(auto i:edge[head.num]){
			if(i==head.p)continue;
			pt.push({i,head.num,head.sum+1});
		}
		pt.pop();
	}
	dl[1]=d1;
	pt.push({d1,d1,1});//另一个端点计算的起点
	while(!pt.empty()){
		ptinfo head=pt.front();
		if(head.sum>d2n){//如果可以成为另一端点
			d2n=head.sum;
			d2=head.num;
			dl[head.sum]=head.num;//第sum层为num
			dsize=max(dsize,head.sum);
		}
		for(auto i:edge[head.num]){
			if(i==head.p)continue;
			pt.push({i,head.num,head.sum+1});
		}
		pt.pop();
	}
	// cout<<dsize<<endl;
	center=dl[dsize/2+(dsize%2)];
	return;
}
void dfs(ll num,ll p){
	bl[num]=fl[num];
	for(auto i:edge[num]){
		if(i==p)continue;
		fl[i]=fl[num]+1;//此点离中心的距离
		dfs(i,num);//距离越远,值越大
		bl[num]=max(bl[num],bl[i]);//跟新的距离作比较
	}
}
int main(){
	ll k;
	cin>>n>>k;
	for(ll i=1;i<=n-1;i++){
		ll u,v;
		cin>>u>>v;
		edge[u].push_back(v);
		edge[v].push_back(u);
	}
	lfd();
	dfs(center,center);
	//debug
//	cout<<"d:";
//	for(ll i=1;dl[i];i++)cout<<dl[i]<<" ";
//	cout<<"\ndsize:"<<dsize;
//	cout<<"\ncenter:"<<center<<endl<<"k:"<<k<<"\n";
//	cout<<"mfn:"<<mfn<<"\n\n";
//	for(ll i=1;i<=n;i++)cout<<i<<":"<<fl[i]<<"\n";
	//debug
	for(ll i=1;i<=n;i++)bir[i]=bl[i]-fl[i];
	sort(bir+1,bir+1+n);
	cout<<bir[n-k]+1;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...