已经交了近一页了,除了UKE就是RE,实在没办法了,求助大佬!!
//#pragma GCC optimize(2)
//#pragma GCC optimize(3)
//#pragma GCC optimize("Ofast","inline")
#include<bits/stdc++.h>
#define fr(a) freopen(a,"r",stdin)
#define fw(a) freopen(a,"w",stdout)
using namespace std;
typedef int ll;
const int N=1010;
struct node{
ll v,nxt;
}edge[2*N];
ll n,m;
ll tv[N],tot,val[N],qwq;
string guo[N];
vector <string> son[N];
ll head[N],cnt,dp[N][N],sze[N];
bool b[N];
map <string,ll> mp;
ll to_ll(string s){
ll ans=0;
for(int i=0;i<s.length();i++) ans=ans*10+s[i]-'0';
return ans;
}
ll add(ll u,ll v){
edge[++cnt]=(node){v,head[u]};
head[u]=cnt;
}
ll dfs(ll now,ll fa){//dp[i][j]表示以i为根的子树中,当然i不选,能买通j个国家的最小代价
dp[now][0]=0;
for(int i=head[now];i;i=edge[i].nxt){
ll vv=edge[i].v;
if(vv==fa) continue;
dfs(vv,now);
sze[now]+=sze[vv];
for(int j=n;j>=0;j--){
for(int k=0;k<=j;k++){
dp[now][j]=min(dp[now][j],dp[now][j-k]+dp[vv][k]);
}
}
}
sze[now]++;
if(now){
dp[now][sze[now]]=min(dp[now][sze[now]],val[now]);
// printf("now:%lld j:%d dp:%lld val:%lld\n",now,j,dp[now][j],val[now]);
}
}
int main(){
stringstream is;
string tmp;
while(getline(cin,tmp)&&tmp[0]!='#'){
qwq=tot=cnt=0;memset(tv,0,sizeof tv),memset(val,0,sizeof val);
memset(b,0,sizeof b);
memset(dp,0x3f,sizeof dp);memset(head,0,sizeof head);
memset(sze,0,sizeof sze);
memset(son,0,sizeof son);
is.clear();is.str(tmp);
is>>n>>m;
for(int i=1;i<=n;i++){
string awa;ll k=0;
getline(cin,tmp);
is.clear();is.str(tmp);
while(is>>awa){
k++;
if(k==1) guo[i]=awa;
else if(k==2) tv[i]=to_ll(awa);
else son[i].push_back(awa);
}
mp[guo[i]]=i;
}
for(int i=1;i<=n;i++){
ll u=i,v;
for(int j=0;j<son[i].size();j++){
v=mp[son[i][j]];
b[v]=1;
add(u,v),add(v,u);
}
val[u]=tv[i];
}
for(int i=1;i<=n;i++){
if(!b[i]){
add(0,i),add(i,0);
}
}
dfs(0,-1);
ll ans=0x3f3f3f3f;
for(int i=m;i<=n;i++){
ans=min(ans,dp[0][i]);
}
printf("%d\n",ans);
}
return 0;
}