求调
查看原帖
求调
408924
lzm2010楼主2022/8/12 08:39
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
using namespace std;
const int N=305,INF=1000000000;
int n,m,k,id,head[N],f[N][N][2];
bool vis[N];
struct tree
{
	int l,r,f,w;
}t[N];
struct edge
{
	int u,v,w,nx;
}e[2*N];

void add(int u,int v,int w)
{
	id++;
	e[id].u=u;
	e[id].v=v;
	e[id].w=w;
	e[id].nx=head[u];
	head[u]=id;
}

void dfs(int x)
{
	if(x==0) return;
	int z=x;
	int i=head[x];
	int v;
	while (i!=0)
	{
		v=e[i].v;
		if(vis[v])
		{
			i=e[i].nx;
			continue;
		}
		vis[v]=true;
		if(z==x) t[z].l=v;
		else t[z].r=v;
		t[v].w=e[i].w;
		z=v;
		dfs(v);
		i=e[i].nx;
	}
}

void init()
{
	int x,y,z;
	vis[1]=true;
	for(int i=0;i<=n;i++)
		for(int j=0;j<=k;j++)
			f[i][j][0]=f[i][j][1]=INF;
	for(int i=1;i<n;i++)
	{
		cin>>x>>y>>z;
		add(x,y,z);
		add(y,x,z);
	}
	dfs(1);
}

int dp(int x,int y,int z)
{
	int t1,t2;
	if(x==0 && y==0) return f[x][y][z]=0;
	if(x==0 || y<0) return INF;
	//if(x==0 || y==0) return INF;
	if(f[x][y][z]!=INF) return f[x][y][z];
	for(int i=0;i<=y;i++)
	{
		t1=dp(t[x].l,i,0)+(z==0 && m==2)*t[x].w;
		t2=dp(t[x].l,i-1,1)+(z==1)*t[x].w;
		f[x][y][z]=min(f[x][y][z],min(t1,t2)+dp(t[x].r,y-i,z));
	}
	//cout<<x<<' '<<y<<' '<<z<<' '<<f[x][y][z]<<endl;
	return f[x][y][z];
}

int main()
{
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	cin>>n>>m>>k;
	if(m-1+k>n)
	{
		cout<<"-1";
		return 0;
	}
	init();
	cout<<dp(t[1].l,k-1,1);
    return 0;
}

评测数据 :https://www.luogu.com.cn/record/83427854

求求dalao了再不AC我就要被揍s了

2022/8/12 08:39
加载中...