算是换根dp,50分,hack也没过
查看原帖
算是换根dp,50分,hack也没过
1067789
Director_Ni楼主2025/2/3 16:57

求调

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=3*10e5+3;
//const int N=15;
int n,n_edge;
struct edge{
    int to,next;
}e[N<<1];
int head[N],idx=0;
ll ans=0;
void addedge(int a,int b){
    e[idx].to=b;e[idx].next=head[a];
    head[a]=idx++;
}
ll f[N],c[N];
void dsf(int x,int fa){
    ll d1=0,d2=0;//最大儿子🐛
    for(int i=head[x];i!=-1;i=e[i].next){
        int v=e[i].to;
        if(v==fa)   continue;
        c[x]++;
        dsf(v,x);
        f[x]=max(f[x],f[v]);
        if(f[v]>=d1){d2=d1;d1=f[v];}
        else if(f[v]>d2)    d2=f[v];
    }
    if(!c[x])   {f[x]=1;return;}
    f[x]+=1+max((ll)0,c[x]-1);
    ans=max(ans,f[x]+d2-1);
}
int main(){
    memset(head,-1,sizeof head);
    scanf("%d%d",&n,&n_edge);
    for(int i=1;i<n;++i){
        int t1,t2;
        scanf("%d%d",&t1,&t2);
        addedge(t1,t2);
        addedge(t2,t1);
    }
    dsf(1,-1);
    
    cout<<ans;
}

2025/2/3 16:57
加载中...