【题解】CF1830A

首先这道题肯定不能暴力枚举,我们要思考其他算法。

我们可以给每一条边编一个号。然后从根开始遍历这棵树,当一条边的编号比他祖先到他祖先的祖先的那条边的编号还要小时,就说明顺序错了,要再等一轮。

这个就简单了,直接 dfs 就行,注意答案要加 \(1\)

#include <bits/stdc++.h>
using namespace std;
vector<int> to[200005],id[200005];

int dfs(int x,int fa,int pre){ //x当前节点,fa上一个节点(因为是无向图),pre上一条边的编号
    int res=0;
    for(int i=0;i<to[x].size();i++){
        if(to[x][i]!=fa) res=max(res,dfs(to[x][i],x,id[x][i])+(id[x][i]<pre)); //(id[x][i]<pre)是一个布尔表达式,如果为真就加1
    }
    return res;
}
int main(){
    int T; cin>>T;
    while(T--){
        int n; cin>>n;
        for(int i=1;i<=n;i++) to[i].clear(),id[i].clear(); //注意多测清空
        for(int i=1;i<n;i++){
            int x,y;
            cin>>x>>y;
            to[x].push_back(y); to[y].push_back(x);
            id[x].push_back(i); id[y].push_back(i); //给每一条边编号
        }
        cout<<dfs(1,0,0)+1<<'\n';
    }
    return 0;
}
posted @ 2025-01-03 19:44  日月月  阅读(8)  评论(0编辑  收藏  举报