首先这道题肯定不能暴力枚举,我们要思考其他算法。
我们可以给每一条边编一个号。然后从根开始遍历这棵树,当一条边的编号比他祖先到他祖先的祖先的那条边的编号还要小时,就说明顺序错了,要再等一轮。
这个就简单了,直接 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;
}
标签:Draws,int,题解,back,Trees,编号,push,id
From: https://www.cnblogs.com/sapo1o/p/18650826