码迷,mamicode.com
首页 > 其他好文 > 详细

旧题复习

时间:2016-11-17 01:21:39      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:inf   amp   分组   背包   分配   getc   mat   p12   har   

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;}
}

 

旧题复习

标签:inf   amp   分组   背包   分配   getc   mat   p12   har   

原文地址:http://www.cnblogs.com/candy99/p/6071833.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!