旧题复习

Posted Candy?

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了旧题复习相关的知识,希望对你有一定的参考价值。

1.树形背包

洛谷P1273有线电视网==poj1155tele

//一个孩子一个分组,枚举每个组选几个(给每个孩子分配体积)
//沙茶的输出打错了
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=3e3+5,INF=1e9;
int read(){
    char c=getchar();int x=0,f=1;
    while(c<0||c>9){if(c==-)f=-1; c=getchar();}
    while(c>=0&&c<=9){x=x*10+c-0; c=getchar();}
    return x*f;
}
int n,m,s,v,w;
struct edge{
    int v,w,ne;
}e[N<<1];
int h[N],cnt=0;
void ins(int u,int v,int w){
    cnt++;
    e[cnt].v=v;e[cnt].w=w;e[cnt].ne=h[u];h[u]=cnt;
    cnt++;
    e[cnt].v=u;e[cnt].w=w;e[cnt].ne=h[v];h[v]=cnt;
}

int d[N][N],son[N];
void dfs(int u,int fa){
    if(u>=n-m+1) return;
    for(int j=1;j<=m;j++) d[u][j]=-INF;
    
    for(int i=h[u];i;i=e[i].ne){
        int v=e[i].v,w=e[i].w;
        if(v==fa) continue;
        dfs(v,u);
        son[u]+=son[v];
        for(int j=son[u];j>=1;j--){
            int t=min(j,son[v]);
            for(int k=1;k<=t;k++)
                d[u][j]=max(d[u][j],d[u][j-k]+d[v][k]-w);
        }
    }
}
int main(){
    n=read();m=read();
    for(int i=1;i<=n-m;i++){
        s=read();
        while(s--){v=read();w=read();ins(i,v,w);}
    }
    for(int i=n-m+1;i<=n;i++) d[i][1]=read(),son[i]=1;
    dfs(1,0);
    for(int i=m;i>=1;i--) if(d[1][i]>=0) {printf("%d",i);break;}
}

 

以上是关于旧题复习的主要内容,如果未能解决你的问题,请参考以下文章

旧题新做:从idy的视角看数据结构

7.11做pdsdt狮虎给的旧题mms协议分析

安卓复习8

安卓复习8

安卓复习8

JavaScript期末复习