随笔 - 531  文章 - 0  评论 - 3  阅读 - 10215 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#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   towboat  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示