题目323. 战略游戏题目描述鲍勃喜欢玩电脑游戏特别是战略游戏但有时他找不到解决问题的方法这让他很伤心。现在他有以下问题。他必须保护一座中世纪城市这条城市的道路构成了一棵树。每个节点上的士兵可以观察到所有和这个点相连的边。他必须在节点上放置最少数量的士兵以便他们可以观察到所有的边。你能帮助他吗例如下面的树只需要放置 1 名士兵在节点 1 处就可观察到所有的边。输入格式输入包含多组测试数据每组测试数据用以描述一棵树。对于每组测试数据第一行包含整数 N表示树的节点数目。接下来 N 行每行按如下方法描述一个节点。节点编号(子节点数目) 子节点 子节点 …节点编号从 0 到 N−1每个节点的子节点数量均不超过 10每个边在输入数据中只出现一次。输出格式对于每组测试数据输出一个占据一行的结果表示最少需要的士兵数。数据范围0 N ≤ 1500 , 0N≤1500,0N≤1500,一个测试点所有 N 相加之和不超过 300650 。 一个测试点所有 N 相加之和不超过 300650。一个测试点所有N相加之和不超过300650。时空限制1s / 64MB输入样例4 0:(1) 1 1:(2) 2 3 2:(0) 3:(0) 5 3:(3) 1 4 2 1:(1) 0 2:(0) 0:(0) 4:(0)输出样例1 2代码#includebits/stdc.husingnamespacestd;constintN150010;intn,f[N][2];boolhas_fa[N];vectorintg[N];voiddfs(intu){f[u][1]1;intleng[u].size();for(inti0;ilen;i){intvg[u][i];dfs(v);f[u][0]f[v][1];f[u][1]min(f[v][0],f[v][1]);}}intmain(){while(~scanf(%d,n)){intm0,u0,v0;memset(has_fa,false,sizeofhas_fa);memset(f,0,sizeoff);for(inti0;in;i){scanf(%d:(%d) ,u,m);while(m--){scanf(%d,v);has_fa[v]true;g[u].push_back(v);}}introot0;while(has_fa[root])root;dfs(root);printf(%d\n,min(f[root][0],f[root][1]));for(inti0;in;i)g[i].clear();}return0;}结果