diff --git a/POJ/1947_infnty.cpp b/POJ/1947_infnty.cpp new file mode 100644 index 0000000..d804e3d --- /dev/null +++ b/POJ/1947_infnty.cpp @@ -0,0 +1,72 @@ +#include +#include +#include +#include +#include +#include +using namespace std; +#define REP(i,n) for(int _REP_N=(n),i=0;i<_REP_N;i++) + +int N, parent[200], kid[200], sib[200], memo[200][200], INF=1<<25; +vector adj[200]; + +int g(int x, int k); + +int f(int x, int k) { + int &res = memo[x][k]; + if (res != -1) return res; + + if (x == 0) return res = (k==0 ? 0 : INF); + + assert(2 <= x && x <= N && k >= 0); + + res = 1 + f(sib[x], k); + + for (int u = 1; u <= k; u++) + res = 0); + int deg = adj[x].size() - (x==1 ? 0 : 1); + if (k == 0) return 0; + if (k == 1) return deg; + if (deg == 0) return INF; + return f(kid[x], k-1); +} + +void dfs(int x, int p) { + parent[x] = p; + kid[x] = 0; + + REP(i, adj[x].size()) { + int y = adj[x][i]; + if (y != p) { + sib[y] = kid[x]; + kid[x] = y; + dfs(y, x); + } + } +} + +int main() { + int P; + scanf("%d %d", &N, &P); + REP(i, N-1) { + int x, y; + scanf("%d %d", &x, &y); + adj[x].push_back(y); + adj[y].push_back(x); + } + + kid[0] = sib[0] = parent[0] = 0; + dfs(1, 0); + + memset(memo, 0xff, sizeof(memo)); + + int res = INF; + for (int x = 1; x <= N; x++) + res