社区讨论

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 条回复,欢迎继续交流。

正在加载回复...