给出根节点(BOSS)
然后还有N-1个边 A B 由B指向A (B为A 的上司)
每次只能选择这个关系中的其中一个
求最多选几个点
并且输出是不是唯一的
重点判断是否唯一:
1.若下属不去和去都人数一样的话则上司不去的话就不唯一(上司去了下属必定不能去,所以不满足)
2.若下属不去还不唯一的话 上司去了也是不唯一
#include <cstdio> #include <cstdlib> #include <cstring> #include <climits> #include <cctype> #include <cmath> #include <string> #include <sstream> #include <iostream> #include <algorithm> #include <iomanip> using namespace std; #include <queue> #include <stack> #include <vector> #include <deque> #include <set> #include <map> typedef long long LL; #define pi acos(-1.0) #define lson l, m, rt<<1 #define rson m+1, r, rt<<1|1 map<string ,int >mp; const int maxn=10000; vector<int > G[201]; int col[203][2],vis[203],dp[203][2]; void init() { for(int i=0; i<=200; i++) G[i].clear(); mp.clear(); memset(vis,0,sizeof(vis)); memset(dp,0,sizeof(dp)); memset(col,0,sizeof(col)); } void dfs(int u) { if(vis[u]) return ; vis[u]=1; dp[u][1]=1; col[u][1]=col[u][0]=1; for(int i=0; i<G[u].size(); i++) { int v=G[u][i]; if(!vis[v]) { dfs(v); dp[u][1]+=dp[v][0]; dp[u][0]+=max(dp[v][1],dp[v][0]); if(dp[v][0]==dp[v][1])//判断唯一 col[u][0]=false; if(!col[v][0]) col[u][1]=false; } } } int main() { #ifndef ONLINE_JUDGE freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); #endif int n; string s,s1,s2; while(~scanf("%d", &n),n) { int tol=0; init(); cin>>s; mp[s]=++tol; for(int i=0; i<n-1; i++) { cin>>s1>>s2; if(mp[s1]==0) mp[s1]=++tol; if(mp[s2]==0) mp[s2]=++tol; int a=mp[s1],b=mp[s2]; G[b].push_back(a); } dfs(1); printf("%d ",max(dp[1][0],dp[1][1])); if(dp[1][0]>dp[1][1]&&col[1][0]||dp[1][0]<dp[1][1]&&col[1][1]) puts("Yes"); else puts("No"); } return 0; }
【树形DP】 HDU 2412 Party at Hali-Bula
原文地址:http://blog.csdn.net/kewowlo/article/details/39759771