社区讨论
WA #11,12,13,14,求调
P1099[NOIP 2007 提高组] 树网的核参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mm1o3np8
- 此快照首次捕获于
- 2026/02/25 14:42 2 周前
- 此快照最后确认于
- 2026/02/26 19:40 2 周前
CPP
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
const int maxn=300005;
struct edge{
int v,w;
};
vector<edge> e[maxn];
int c,n,s,de[maxn],f[maxn],d[maxn],cnt,pre[maxn],pos[maxn];
bool vis[maxn];
void dfs(int u,int fa){
f[u]=fa;
for(auto i:e[u]){
if(i.v==fa||vis[i.v])continue;
de[i.v]=de[u]+i.w;
if(de[i.v]>de[c])c=i.v;
dfs(i.v,u);
}
}
void g(){
dfs(1,0);
de[c]=0;
dfs(c,0);
for(int u=c;u!=0;u=f[u]){
d[++cnt]=u;
pre[cnt]=de[u];
}
reverse(d+1,d+cnt+1);
reverse(pre+1,pre+cnt+1);
for(int i=cnt;i>0;i--)pos[i]=pre[cnt]-pre[i];
}
void solve(){
int ans=1<<30;
for(int l=1,r=1;l<=cnt;l++){
while(r<=cnt&&pre[r+1]-pre[l]<=s)r++;
memset(vis,0,sizeof(vis));
for(int k=l;k<=r;k++)vis[d[k]]=1;
int ecc=0;
de[d[l]]=0,c=0;
dfs(d[l],0);
ecc=max(ecc,de[c]);
de[d[r]]=0,c=0;
dfs(d[r],0);
ecc=max(ecc,de[c]);
ans=min(ans,ecc);
}
cout<<ans;
}
int main() {
ios::sync_with_stdio(false);
cin>>n>>s;
for(int i=1;i<n;i++){
int u,v,w;
cin>>u>>v>>w;
e[u].push_back((edge){v,w});
e[v].push_back((edge){u,w});
}
g();
solve();
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...