萌新求助
查看原帖
萌新求助
939998
Sheez楼主2023/5/2 14:14

呜呜呜只有 30pts,求教教

/*
Tue. 2023.5.2
Powered by Sheez
*/
#include<bits/stdc++.h>
using namespace std;
const int N=3e5+10;
struct edge{int t;long long w;};
int n,L,R,k,pre[N],nex[N];
long long Max[N],dis[N],ltmp,ans;
bool vis[N];
vector<edge>e[N];
void dfs1(int u,int fa,long long len,bool b)
{
    vis[u]=1;
    if(len>ltmp){ltmp=len;if(b)L=u;}
    for(auto x:e[u])
        if(!vis[x.t]&&fa!=x.t)dfs1(x.t,u,len+x.w,b);
    return;
}
void dfs2(int u,int fa,long long len,bool b)
{
    vis[u]=1;
    if(len>ltmp){ltmp=len;if(b)R=u;}
    for(auto x:e[u])
        if(!vis[x.t]&&fa!=x.t)dfs2(x.t,u,len+x.w,b);
    return;
}
bool pretr(int u)
{
    vis[u]=1;
    if(u==R)return 1;
    for(auto x:e[u])
        if(!vis[x.t]&&pretr(x.t))
            {pre[x.t]=u;nex[u]=x.t;dis[u]=dis[x.t]-x.w;return 1;}
    return 0;
}
signed main()
{
    scanf("%d",&n);
    for(int i=1;i<n;i++)
    {
        int x,y;long long z;
        scanf("%d%d%lld",&x,&y,&z);
        e[x].push_back(edge{y,z});e[y].push_back(edge{x,z});
    }
    dfs1(1,0,0,1);memset(vis,0,sizeof(vis));ltmp=0;
    dfs2(L,0,0,1);memset(vis,0,sizeof(vis));
    printf("%lld\n",dis[R]=ltmp);
    pretr(L);memset(vis,0,sizeof(vis));
    for(int i=R;i;i=pre[i])vis[i]=1;
    for(int i=R;i;i=pre[i])ltmp=0,dfs1(i,0,0,0),Max[i]=ltmp;
    //for(int i=L;i;i=nex[i])printf("%d %d %d\n",i,dis[i],Max[i]);
    for(k=L;k;k=nex[k])if(dis[R]-dis[k]==Max[k])break;
    for(;k;k=pre[k])if(dis[k]-dis[L]!=Max[k])ans++;
    printf("%lld\n",ans);
    return 0;
}
2023/5/2 14:14
加载中...