这个思路哪里有问题?
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
typedef long long ll;
vector<ll>V[114514];
ll book[114514];
vector<ll>V1[114514];
ll F[114514];
void dfs(ll n){
book[n]=1;
ll tl=V[n].size();
for(int i=0;i<tl;i++){
if(book[V[n][i]]==1){
continue;
}
V1[n].push_back(V[n][i]);
dfs(V[n][i]);
}
}//建成以0为根的树
ll dp[114514][3];//0代表父亲看我,1代表我看儿子和父亲,2代表要儿子看我
queue<ll>Q;
ll ans=0x7fffffff;
void dfs1(ll n){
book[n]=1;
ll tl=V1[n].size();
if(tl==0){
ans=min(ans,dp[n][0]);
ans=min(ans,dp[n][1]);
}
for(int i=0;i<tl;i++){
dfs1(V1[n][i]);
}
}//来统计答案
int main(){
ll n;
cin>>n;
ll k;
ll a,b;
for(int i=1;i<=n;i++){
cin>>b;
cin>>k;
for(int j=1;j<=k;j++){
cin>>a;
V[b].push_back(a);
V[a].push_back(b);
}
}
dfs(0);
ll t1,t2,tl;
dp[0][1]=1;
dp[0][0]=0x7fffffff;
Q.push(0);
while(Q.size()){
t1=Q.front();
Q.pop();
tl=V1[t1].size();
for(int i=0;i<tl;i++){
t2=V1[t1][i];
dp[t2][0]=dp[t1][1];
dp[t2][1]=min(dp[t1][0]+1,dp[t1][1]+1);
dp[t2][1]=min(dp[t2][1],dp[t1][2]+1);
dp[t2][2]=min(dp[t1][0],dp[t1][1]);
Q.push(t2);
}
}
dfs1(0);
cout<<ans;
return 0;
}