zoukankan      html  css  js  c++  java
  • Codeforces369C Valera and Elections

    题意:输入N个点,接下来N-1条边,选出一个点集,修复由这个点到1的路,问最小点集是多少,并输出

    题解:树型DP,dp[i]代表及其孩子要选取的点的个数,一个点要选的条件是孩子到这个点的边需要修复且孩子节点下面没有需要修复的路

    #include <bits/stdc++.h>
    #define maxn 101000
    #define INF 0x3f3f3f3f
    typedef long long ll;
    using namespace std;
    struct edge{
        int from, to, w;
    };
    vector<edge>edges;
    vector<int >G[maxn];
    int dir[maxn], dp[maxn];
    vector<int >v;
    void dfs(int x){
        dir[x] = 1;
        for(int i=0;i<G[x].size();i++){
            int u = G[x][i];
            edge c = edges[u];
            if(dir[c.to]) continue;
            dfs(c.to);
            if(dp[c.to]) dp[x] += dp[c.to];
            else if(dp[c.to]==0&&c.w == 2) dp[x]++, v.push_back(c.to);
    
        }
    }
    void add(int a,int b,int t){
        edges.push_back((edge){a, b, t});
        G[a].push_back(edges.size()-1);
    }
    int main(){
        int n, a, b, t;
        scanf("%d", &n);
        for(int i=0;i<n-1;i++){
            scanf("%d%d%d", &a, &b, &t);
            add(a, b, t);
            add(b, a, t);
        }
        dfs(1);
        cout<<v.size()<<endl;
        for(int i=0;i<v.size();i++)
            cout<<v[i]<<" ";
        return 0;
    }
  • 相关阅读:
    一行代码搞定图片缩放、旋转、加水印
    如何学习 Webpack
    Webpack 概念
    Webpack 入门
    asp.net core教程 (一)
    asp.net core教程 (二)
    ap.net core 教程(三)
    Grafana 安装配置
    zabbix-3.0.x LTS源码安装配置
    MariaDB Security
  • 原文地址:https://www.cnblogs.com/Noevon/p/8337436.html
Copyright © 2011-2022 走看看