【玄关】求条
查看原帖
【玄关】求条
785639
xuchuhan楼主2024/9/24 16:03

rt。建完图以后就是用的P2014 [CTSC1997] 选课的代码。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=205;
int n,m;
int a[N],in[N],siz[N];
int dp[N][N];
string s,s1,s2;
vector<string>tmp[N];
vector<int>v[N];
map<string,int>mp;
void init(){
	mp.clear();
	for(int i=1;i<=n;i++)
		tmp[i].clear(),v[i].clear();
	s.clear(),s1.clear(),s2.clear();
	memset(a,0,sizeof(a));
	memset(in,0,sizeof(in));
	memset(siz,0,sizeof(siz));
	memset(dp,0x3f,sizeof(dp));
	return;
}
void DFS(int x){
	siz[x]=1,dp[x][1]=bool(!in[x])*a[x];
	for(int i=0;i<v[x].size();i++){
		int to=v[x][i];
		DFS(to);
		siz[x]+=siz[to];
		for(int j=min(m+1,siz[x]);j>=0;j--)
			for(int k=0;k<=min(siz[to],j-1);k++)
				dp[x][j]=min(dp[x][j],dp[x][j-k]+dp[to][k]);
	}
	return;
}
signed main(){
	while(1){
		init();
		getline(cin,s);
		if(s=="#")
			break;
		stringstream str1;
		str1<<s;
		str1>>n>>m;
		for(int i=1;i<=n;i++){
			getline(cin,s);
			stringstream str2;
			str2<<s;
			str2>>s1>>a[i];
			mp[s1]=i;
			while(str2>>s2)
				tmp[mp[s1]].push_back(s2);
		}
		for(int i=1;i<=n;i++){
			for(int j=0;j<tmp[i].size();j++){
				v[i].push_back(mp[tmp[i][j]]);
				in[mp[tmp[i][j]]]++;
			}
		}
		for(int i=1;i<=n;i++)
			if(!in[i])
				v[0].push_back(i);
		DFS(0);
		cout<<dp[0][m+1]<<"\n";
	}
	return 0;
}
2024/9/24 16:03
加载中...