题目描述:
给你一棵树,每条边有2,1两种情况 每次可以选择一个点走到1点(根节点) 问最少选择几个点可以把边是2的点走完
分析:加入有一个条边是2 那么只需要找有没有子节点有2的边  有的话走子节点  没有的话走这个点   这个题比较特殊的是dfs遍历树   可以学习下存储方法;
ac代码:
#include<bits/stdc++.h>
using namespace std;
const int MAX=1e5+2;
vector<int> Edge[MAX];
int anss[MAX],top=0;
int vis[MAX];
int dfs (int node,int flag){
//    cout<<node<<endl;
    vis[node]=1;
    int len=Edge[node].size(),s=0,i;
    for( i=0;i<len;i+=2){
        if(vis[Edge[node][i]]==0){
            if(Edge[node][i+1]==2) s+=dfs(Edge[node][i],1);
            else s+=dfs(Edge[node][i],0);
        }
    }
//    cout<<flag<<' '<<s<<' '<<node<<endl;
    if(flag&&!s) {anss[top++]=node;return 1;}
    return s;
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
//    freopen("1.txt","r",stdin);
    int n;
    cin>>n;
    for(int i=1;i<=n-1;i++){
        int x,y,t;
        cin>>x>>y>>t;
        Edge[x].push_back(y);
        Edge[x].push_back(t);
        Edge[y].push_back(x);
        Edge[y].push_back(t);
    }
    memset(vis,0,sizeof(vis));
    dfs(1,0);
    cout<<top<<endl;
    if(top!=0){ cout<<anss[0];
    for(int i=1;i<top;i++)
        cout<<' '<<anss[i];
    cout<<endl;}

}