水水水水水の入门题 = =。。只是为了弥补我一年多以来树形dp从来没有ac过的遗憾!!!(呵呵!!)
顺带吐槽一下lrj的题面再次翻译错了2333333
这个代码真的是我写的。。。 = =
不要问我代码风格是怎么回事。。。。。。
是xcode的神代码补全干的。。。。
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
const int Nmax = 1505;
int N;
int dp[Nmax][3];
struct ed{
int v, next;
}e[Nmax * 2];
int k, head[Nmax];
inline void adde(int u, int v)
{
e[k] = (ed) { v, head[u] };
head[u] = k++;
}
int dfs(int u, int flag, int fa)
{
if (~dp[u][flag]) return dp[u][flag];
int &ans = dp[u][flag] = flag;
for (int i = head[u]; i; i = e[i].next) {
int v = e[i].v; if (v == fa) continue;
if (flag) ans += min(dfs(v, 0, u), dfs(v, 1, u));
else ans += dfs(v, 1, u);
}
return ans;
}
int main()
{
while (~scanf("%d", &N)) {
int u, v, m;
memset(head, 0, sizeof(head)); k = 1;
for (int i = 1; i <= N; ++i) {
scanf("%d:(%d)", &u, &m);
while (m--) {
scanf("%d", &v);
adde(u, v); adde(v, u);
}
}
memset(dp, -1, sizeof(dp));
printf("%d\n", min(dfs(0, 0, -1), dfs(0, 1, -1)));
}
return 0;
}