Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
关于树形dp的一点想法(不包含优化)用f[i][4]数组 f[i][0]:以i为顶点的子树中,还有一条以i节点为一端的链(链长>2)未被覆盖时,连边的最小值。 f[i][1]:以i为顶点的子树全部覆盖时,连边的最小值。 f[i][2]:以i为顶点的子树中,仅剩i节点未被覆盖时,连边的最小值。 f[i][3]:以i为顶点的子树中,仅剩i节点和其一子节点未被覆盖时,连边的最小值。 可知当i为叶子,f[i][0]=f[i][1]=f[i][3]=INF,f[i][2]=0; 当i非叶子 f[i][0]: 需要还有一条以i节点的子节点为一端的链未被覆盖,同时保证其它子节点被覆盖 即 f[i][0]=INF; for(u为i的子节点) { vl=min(f[u][0],f[u][3]); for(k为i的子节点且k!=u)vl+=f[k][1]; f[i][0]=min(vl,f[i][0]); } f[i][1]: 此时,需要一条包含i的链(链长>2),这样加条边就成环 以i为顶点:f[i][0]+1便是答案 不以i为顶点,在里面的找两个子树中的链或子节点,同时保证其它子节点被覆盖 即 f[i][1]=f[i][0]+1; for(u为i的子节点) for(k为i的子节点且k!=u) { vl=1+min(f[u][0],f[u][2],f[u][3])+min(f[k][0],f[k][2],f[k][3]); for(c为i的子节点且c!=u且c!=k) vl+=f[c][1]; f[i][1]=min(vl,f[i][1]); } f[i][2]: 此时,下面必然全部被覆盖 即: f[i][2]=0; for(u为i的子节点)f[i][2]+=f[u][1]; f[i][3]: 此时,需要还有一个i节点的子节点为一端的链未被覆盖,同时保证其它子节点被覆盖 即 f[i][3]=INF; for(u为i的子节点) { vl=f[u][2]; for(k为i的子节点且k!=u)vl+=f[k][1]; f[i][0]=min(vl,f[i][0]); } 最后答案就是f[root][1](当f[root][1]==INF时输出-1); Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator