标签:ase using cas .com string can ons size nbsp
题目链接: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\n" , ++Case , ans); } return 0; }
lightoj 1201 - A Perfect Murder(树形dp)
标签:ase using cas .com string can ons size nbsp
原文地址:http://www.cnblogs.com/TnT2333333/p/7136774.html