社区讨论

有奆佬帮蒟蒻DEBUG啊

CF911FTree Destruction参与者 3已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@locnu8sf
此快照首次捕获于
2023/10/30 16:50
2 年前
此快照最后确认于
2023/11/05 03:51
2 年前
查看原帖
丑陋的代码:(不要在意这恐怖的5dfs)
CPP
#include<cstdio>
#include<vector>
using namespace std;
int ans;
int maxdep;
int r[200001];
int dis[200001];
int n,root1,root2;
bool diameter[200001];
vector<int> G[200001];
void dfs1(int u,int fa,int dep)
{
    if(dep>maxdep)
    {
        root1=u;
        maxdep=dep;
    }
    for(int i=0;i<G[u].size();i++)
    {
        int v=G[u][i];
        if(v!=fa)
        {
            dfs1(v,u,dep+1);
        }
    }
}
void dfs2(int u,int fa,int dep)
{
    if(dep>maxdep)
    {
        root2=u;
        maxdep=dep;
    }
    for(int i=0;i<G[u].size();i++)
    {
        int v=G[u][i];
        if(v!=fa)
        {
            dfs2(v,u,dep+1);
        }
    }
}
bool dfs3(int u,int fa,int dep)
{
    r[u]=root1;
    dis[u]=dep;
    if(u==root2)
    {
        diameter[u]=1;
        return 1;
    }
    bool res=0;
    for(int i=0;i<G[u].size();i++)
    {
        int v=G[u][i];
        if(v!=fa)
        {
            if(dfs3(v,u,dep+1))
            {
                res=1;
                diameter[u]=1;
            }
        }
    }
    return res;
}
void dfs4(int u,int fa,int dep)
{
    if(dep>dis[u])
    {
        dis[u]=dep;
        r[u]=root2;
    }
    for(int i=0;i<G[u].size();i++)
    {
        int v=G[u][i];
        if(v!=fa)
        {
            dfs4(v,u,dep+1);
        }
    }
}
void dfs5(int u,int fa)
{
    ans+=maxdep;
    maxdep--;
    for(int i=0;i<G[u].size();i++)
    {
        int v=G[u][i];
        if((v!=fa)&&diameter[v])
        {
            printf("%d %d %d\n",u,v,u);
            dfs5(v,u);
        }
    }
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n-1;i++)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        G[u].push_back(v);
        G[v].push_back(u);
    }
   dfs1(1,0,0);
   maxdep=0;
   dfs2(root1,0,0);
   dfs3(root1,0,0);
   dfs4(root2,0,0);
   for(int i=1;i<=n;i++)
   {
       if(!diameter[i])
       {
           ans+=dis[i];
       }
   }
   ans+=((1+maxdep)*maxdep)/2;
   printf("%d\n",ans);
   for(int i=1;i<=n;i++)
   {
       if(!diameter[i])
       {
           printf("%d %d %d\n",i,r[i],i);
       }
   }
   dfs5(root1,0);
}

回复

3 条回复,欢迎继续交流。

正在加载回复...