做題記錄 POJ 1463
阿新 • • 發佈:2021-06-17
又是外面的 OJ ...
火車頭帶著交了,Time Limit Exceeded.
哦,原來有多測。
while(scanf("%d", &n) != EOF)
再交
Accepted.
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define N 100005 int f[N][2], first[N], Next[N], to[N], h[N], vis[N], fa[N], tot, n; void add(int x, int y) { Next[++tot] = first[x]; first[x] = tot; to[tot] = y; return; } void dp(int u) { if(vis[u]) { return; } vis[u] = 1; for(int i = first[u]; i; i = Next[i]) { int v = to[i]; if(vis[v]) { continue; } dp(v); f[u][0] += f[v][1]; f[u][1] += min(f[v][0], f[v][1]); } return; } int main() { ios::sync_with_stdio(false); while(scanf("%d", &n) != EOF) { tot = 0; memset(first, 0, sizeof(first)); memset(vis, 0, sizeof(vis)); memset(fa, 0, sizeof(fa)); for(int i = 0; i <= n; i++) { f[i][0] = 0; f[i][1] = 1; } int u, cnt, v; for(int i = 1; i <= n; i++) { scanf("%d:(%d)", &u, &cnt); for(int j = 1; j <= cnt; j++) { scanf("%d", &v); add(u, v); add(v, u); fa[v] = u; } } int root; for(int i = 1; i <= n; i++) { if(!fa[i]) { root = i; break; } } dp(root); printf("%d\n", min(f[root][0], f[root][1])); } return 0; }