zoukankan      html  css  js  c++  java
  • lightoj 1201

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1201

    题解:简单的树形dp,dp[0][i]表示以i为根结点不傻i的最多有多少dp[0][i]+=max(dp[0][j],dp[1][i]),dp[1][i]表示i傻的最多有多少dp[1][i]+=dp[0][j]。

    注意这些点不一定是全联通的。

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <vector>
    using namespace std;
    const int M = 1e3 + 10;
    vector<int>vc[M];
    int dp[2][M];
    bool vis[M];
    void dfs(int u , int pre) {
        vis[u] = true;
        int len = vc[u].size();
        dp[0][u] = 0 , dp[1][u] = 1;
        for(int i = 0 ; i < len ; i++) {
            int v = vc[u][i];
            if(v == pre || vis[v]) continue;
            dfs(v , u);
            dp[0][u] += max(dp[0][v] , dp[1][v]);
            dp[1][u] += dp[0][v];
        }
    }
    int main() {
        int t , Case = 0;
        scanf("%d" , &t);
        while(t--) {
            int n , m;
            scanf("%d%d" , &n , &m);
            for(int i = 1 ; i <= n ; i++) vc[i].clear() , dp[0][i] = 0 , dp[1][i] = 0 , vis[i] = false;
            for(int i = 0 ; i < m ; i++) {
                int a , b;
                scanf("%d%d" , &a , &b);
                vc[a].push_back(b);
                vc[b].push_back(a);
            }
            int ans = 0;
            for(int i = 1 ; i <= n ; i++) {
                if(!vis[i]) dfs(i , -1) , ans += max(dp[0][i] , dp[1][i]);
            }
            printf("Case %d: %d
    " , ++Case , ans);
        }
        return 0;
    }
    
  • 相关阅读:
    必备单词
    Vim
    Linux基础
    python链表操作详解
    冒泡和快速排序
    学员练车选课系统
    面试题
    获取resp:heads:content-disposition的filename
    记录springBoot启动报错(无脑型)
    springBoot+Vue搭建新项目(1)
  • 原文地址:https://www.cnblogs.com/TnT2333333/p/7136774.html
Copyright © 2011-2022 走看看