#include <iostream>
#include <map>
#include <algorithm>
#include <cstring>
using namespace std; 
 const int N =203 ,M =N; 
 typedef long long ll;
 int n,m,fa[N],c[N],sz[N],f[N][N];
 
 std::map<string,ll>p;
string a[N],s[N],cur;
 int nxt[M],go[M],hd[N],all;
 
 void add_(int x,int y){
 	go[++all]=y,nxt[all]=hd[x]; hd[x]=all;
 }
 void dfs(int x){
 	sz[x]=1;
 	f[x][0]=0;
	for(int i=hd[x];i;i=nxt[i]){
 		int y=go[i]; 
 		dfs(y);
 		sz[x]+=sz[y];
 	}
 	for(int i=hd[x];i;i=nxt[i]){
 		int y=go[i]; 
 		
 		for(int j=sz[x];j>=0;j--)
 		 for(int k=0;k<=j;k++)
 		   f[x][j]=min(f[x][j],f[y][k]+f[x][j-k]);
 		  
 	}
 	if(x)
 	for(int i=0;i<=sz[x];i++)
 		f[x][i]=min(f[x][i],c[x]);
 }

 int main()
{
	int i;
    while(std::cin>>n>>m)
    {
        memset(hd,0,sizeof hd);memset(fa,0,sizeof fa);
        all=0;
        memset(f,0x3f,sizeof f);
        p.clear();

        for(ll i=1;i<=n;++i)
        {
            std::cin>>a[i]>>c[i];
            p[a[i]]=i;
            s[i]="";
            char ch=getchar();
            if(ch==' ')ch=getchar();
            while(ch!='\n'&&ch!='\r'){
                s[i].push_back(ch);ch=getchar();
            }
        }
        for(ll i=1;i<=n;++i)
        {
            cur="";
            for(ll j=0;j<s[i].size();++j)
                if(s[i][j]==' ')
                {
                    ll v=p[cur];
                    fa[v]=i;
                    add_(i,v);
                    cur="";
                }
                else cur.push_back(s[i][j]);
            if(cur=="")continue;
            ll v=p[cur];
            fa[v]=i;
            add_(i,v);
        }
        c[0]= 1e9;
        for(ll i=1;i<=n;++i)
            if(!fa[i]) add_(0,i);
            
        dfs(0);
        cout<<f[0][m]<<endl;
    }
    return 0;
}


 
 

 

posted on 2023-02-20 18:46  towboat  阅读(19)  评论(0)    收藏  举报