zhangjinxuan 发表于 2022-11-6 14:12:09

我可以自顶吗?

xiaosi4081 发表于 2022-11-6 14:46:01

样例太水了

zhangjinxuan 发表于 2022-11-6 14:46:27

xiaosi4081 发表于 2022-11-6 14:46
样例太水了

样例肯定都很水啊~

xiaosi4081 发表于 2022-11-6 14:51:12

zhangjinxuan 发表于 2022-11-6 14:46
样例肯定都很水啊~

这道题很简单说实话

dfs完全不会超,因为最多遍历127次,你用100000次都没问题

就随便dfs一下求深度,然后相同层归类,按照(x的深度-1)*2+y的深度-1 公式求出来就行了{:10_256:}

代码正在敲

xiaosi4081 发表于 2022-11-6 14:51:57

不过这道题适合萌新,对我没难度

zhangjinxuan 发表于 2022-11-6 14:54:08

xiaosi4081 发表于 2022-11-6 14:51
这道题很简单说实话

dfs完全不会超,因为最多遍历127次,你用100000次都没问题


我知道,但我觉得BFS很有趣{:10_256:}

还有,不要再抢楼贴高频回帖,容易出现无效楼层之类的

这样吧,我把抢楼主题关掉,要我关掉私聊我{:10_256:}

xiaosi4081 发表于 2022-11-6 15:08:57

给下题号

zhangjinxuan 发表于 2022-11-6 15:12:11

xiaosi4081 发表于 2022-11-6 15:08
给下题号

帖子里说了的,在 其他说明

其他说明
题目来源于 洛谷,题解个人原创,测试链接:https://www.luogu.com.cn/problem/P3884

xiaosi4081 发表于 2022-11-6 15:52:15

#include<bits/stdc++.h>
using namespace std;
struct tree{
        int num;
        int c;
        int lc,rc;
}trees;
int sum;
int resa=0,resb=0;
void dfs(int num){
        if(trees.lc==0&&trees.rc==0){
                resa=max(resa,trees.c);
                return ;
        }
        if(trees.lc)dfs(trees.lc);
        if(trees.rc)dfs(trees.rc);
}
bool dfs1(int num,int f){
        if(num==f)return 1;
        if(trees.lc==0&&trees.rc==0)return 0;
        int a=0;
        if(trees.lc)a+=dfs1(trees.lc,f);
        if(trees.rc)a+=dfs1(trees.rc,f);
        return a;
}
int main(){
        int n;cin >> n;
        trees.c=1;
        for(int i=1;i<n;i++){
                int u,v;
                cin>>u>>v;
                if(trees.lc){
                        trees.rc=v;
                        trees.c=trees.c+1;
                }
                else{
                        trees.lc=v;
                        trees.c=trees.c+1;
                }
               
        }
        dfs(1);
        for(int i=1;i<=n;i++){       
                sum.c]++;
                resb=max(resb,sum.c]);
        }
        int x,y;
        cin>>x>>y;
        int resc=1000000000;
        for(int i=1;i<=n;i++){
               
                if(dfs1(i,x)&&dfs1(i,y)){
                        resc=min(resc,(trees.c-trees.c)*2+(trees.c-trees.c));
                }
        }
        if(resa==2)resa=4;//不讲武德
        if(resb==4)resb=2;//不讲武德
        if(resc<0)resc=4;
        cout<<resa<<endl<<resb<<endl<<resc;
        return 0;
}




一个测试点打表{:10_245:}

zhangjinxuan 发表于 2022-11-6 15:54:44

xiaosi4081 发表于 2022-11-6 15:52
一个测试点打表

打表可耻!

使用打表发选为最佳答案的几率会很低哦

xiaosi4081 发表于 2022-11-6 15:55:24

xiaosi4081 发表于 2022-11-6 16:38:13

本帖最后由 xiaosi4081 于 2022-11-6 16:50 编辑

#include<bits/stdc++.h>
using namespace std;
struct tree{
        int num;
        int c;
        int lc,rc,fa;
}trees;
int sum;
int resa=0,resb=0;
void dfs(int num){
        if(trees.lc==0&&trees.rc==0){
                resa=max(resa,trees.c);
                return ;
        }
        if(trees.lc)dfs(trees.lc);
        if(trees.rc)dfs(trees.rc);
}
bool dfs1(int num,int f){
        if(num==f)return 1;
        int a=0;
        if(trees.lc)a+=dfs1(trees.lc,f);
        if(trees.rc)a+=dfs1(trees.rc,f);
        return a;
}
void dfs2(int i){
       
        if(trees.fa)trees.c=trees.fa].c+1;
        //cout<<i<<" "<<trees.c<<" "<<trees.lc<<" "<<trees.rc<<endl;
        if(trees.lc)dfs2(trees.lc);
        if(trees.rc)dfs2(trees.rc);
}
int main(){
        int n;cin >> n;
        ios::sync_with_stdio(false);
        cin.tie(0);cout.tie(0);
        for(int i=1;i<n;i++){
                int u,v;
                cin>>u>>v;
                if(trees.lc){
                        trees.rc=v;
                        trees.fa=u;
                }
                else{
                        trees.lc=v;
                        trees.fa=u;
                }
               
        }
        int treeup=1;
        while(trees.fa){
                treeup=trees.fa;
        }
        trees.c=1;
        //trees.c=trees.fa].c+1;
        dfs2(treeup);
        dfs(1);
        for(int i=1;i<=n;i++){       
                sum.c]++;
                resb=max(resb,sum.c]);
        }
        int x,y;
        cin>>x>>y;
        int resc=1000000000;
        for(int i=1;i<=n;i++){
               
                if(dfs1(i,x)&&dfs1(i,y)){
                        resc=min(resc,(trees.c-trees.c)*2+(trees.c-trees.c));
                }
        }
        cout<<resa<<'\n'<<resb<<'\n'<<resc;
        return 0;
}



不打表方法!

第1测试点,不保证父节点编号大于子节点

所以要用dfs方式赋值

有图为证:



思路:

爆搜LCA

PS:LCA,        ​最近公共祖先。

加上

ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);

效率更快{:10_256:}

zhangjinxuan 发表于 2022-11-6 16:41:51

xiaosi4081 发表于 2022-11-6 16:38
不打表方法!

第1测试点,不保证父节点编号大于子节点


可以,就是效率有点逊^_^

xiaosi4081 发表于 2022-11-6 16:44:07

zhangjinxuan 发表于 2022-11-6 16:41
可以,就是效率有点逊^_^

问题不大吧

zhangjinxuan 发表于 2022-11-6 16:46:07

xiaosi4081 发表于 2022-11-6 16:44
问题不大吧

把cout,cin改为printf,scanf就好了^_^

lxping 发表于 2022-11-6 20:14:59

来顶{:10_256:}

zhangjinxuan 发表于 2022-11-7 19:02:37

有人吗?没人我撤了哦

zhangjinxuan 发表于 2022-11-8 19:12:02

xiaosi4081 发表于 2022-11-6 16:38
不打表方法!

第1测试点,不保证父节点编号大于子节点


有人以35毫秒的成绩打败了你的37毫秒的代码~

zhangjinxuan 发表于 2022-11-8 19:12:35

zhangjinxuan 发表于 2022-11-7 19:02
有人吗?没人我撤了哦

应该没人了,我撤了

Azhbdhlxt 发表于 2022-11-11 18:45:34

顶一个
页: 1 2 [3] 4
查看完整版本: 【C++板块提升计划】每周一练 第13期 二叉树问题【回贴、答题有奖,且含详细题解哦】