CF Valera and Elections

题目描述:
给你一棵树,每条边有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;}

}

全部评论

相关推荐

那一天的Java_J...:他本来公司就是做这个的,不就是正常的游戏客户端和服务器开发,软硬件联动,有啥恶心不恶心的,提前告诉你就是怕你接受不了,接受不了就没必要再往后走流程浪费时间,虽然这公司是一坨。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务