题目大意就是求树的最小结点集,树上的动态规划基础题,一次深搜就可以解决问题
代码如下:
#include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<iostream> #include<algorithm> #include<vector> #include<map> #include<queue> #include<stack> #include<string> #include<map> #include<set> using namespace std; #define LL long long const int maxn = 1500 + 100; const int INF = 1000000000; int d[maxn][2], vis[maxn]; vector<int> G[maxn]; void dfs(int u) { vis[u] = 1; d[u][1] = 1; d[u][0] = 0; for(int i = 0; i < G[u].size(); i++) { int p = G[u][i]; if(vis[p]) continue; dfs(p); d[u][0] += d[p][1]; d[u][1] += min(d[p][0], d[p][1]); } } int main() { //freopen("input.txt", "r", stdin); int n; while(scanf("%d", &n) == 1) { memset(vis, 0, sizeof(vis)); for(int i = 0; i < n; i++) G[i].clear(); for(int i = 0; i < n; i++) { int u, v, p; scanf("%d:(%d)", &u, &v); for(int j = 0; j < v; j++) { scanf("%d", &p); G[u].push_back(p); G[p].push_back(u); } } dfs(0); int ans = min(d[0][1], d[0][0]); printf("%d\n", ans); } return 0; }
时间: 2024-10-12 12:53:05