AcWing 323. 战略游戏 C++
原题链接
简单
作者:
Sean今天AC了吗
,
2020-08-23 17:00:24
,
所有人可见
,
阅读 812
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1510;
int n;
int head[N], e[N], ne[N], idx;
int f[N][2]; // 状态机: f[i][j]表示以i为根节点的子树的状态是j的集合,属性是数量
bool st[N];
void add(int a, int b){
e[idx] = b;
ne[idx] = head[a];
head[a] = idx ++;
}
void dfs(int u){
f[u][0] = 0;
f[u][1] = 1;
for(int i = head[u]; i != -1; i = ne[i]){
int j = e[i];
dfs(j);
f[u][0] += f[j][1]; // 不选u 选j
f[u][1] += min(f[j][1], f[j][0]); // 选u, 选j or 选u,不选j
}
}
int main(){
while(scanf("%d", &n) != -1){
memset(head, -1, sizeof head);
memset(st, 0, sizeof st);
idx = 0;
for(int i = 0; i < n; i ++){
int id, cnt;
scanf("%d:(%d)", &id, &cnt); // 格式化输入
while(cnt --){
int ver;
scanf("%d", &ver);
add(id, ver);
st[ver] = true;
}
}
int root = 0;
while(st[root]) root ++;
dfs(root);
printf("%d\n", min(f[root][0], f[root][1]));
}
return 0;
}