社区讨论
P5536核心城市98分#6WA求条
题目总版参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @m5yw06on
- 此快照首次捕获于
- 2025/01/16 13:25 去年
- 此快照最后确认于
- 2025/11/04 11:31 4 个月前
除了#6WA了,其他全A。
直径用了BFS,求离核心城市距离用了DFS。
C直径用了BFS,求离核心城市距离用了DFS。
#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 条回复,欢迎继续交流。
正在加载回复...