关于通过控制 size 让每次合并复杂度变成 siza×sizb 总复杂度 O(n2) 的优化
Q1:这个使用有没有什么条件,或者说什么样的题目能用
Q2:这个题
弱弱用这个方法优化了下,样例错了输出 0,但数据 90pts,错的也是输出 0
悬关求助 record
#include<bits/stdc++.h>
#define pt putchar(' ')
#define nl puts("")
#define pi pair<int,int>
#define pb push_back
#define go(it) for(auto &it:as[x]) //注意加了&
using namespace std;
const int N=310;
int n,m,K,u,v,w;
int f[N][N][2],s[N];
vector<pi> as[N];
int fr(){ //double 不能快读!!!!
int x=0,flag=1;
char ch=getchar();
while(ch<'0' || ch>'9'){
if(ch=='-') flag=-1;
ch=getchar();
}
while(ch>='0' && ch<='9'){
x=x*10+(ch-'0');
ch=getchar();
}
return x*flag;
}
void fw(int x){
if(x<0) putchar('-'),x=-x;
if(x>9) fw(x/10);
putchar(x%10+'0');
}
int max(int a,int b){return a>b?a:b;}
int min(int a,int b){return a<b?a:b;}
void dfs(int x,int rt)
{
f[x][0][0]=f[x][1][1]=0;
s[x]=1;
go(it)
{
int v=it.first,w=it.second;
if(v==rt) continue;
dfs(v,x);
for(int j=s[x];~j;j--)
for(int k=s[v];~k;k--)
{
int &T1=f[x][j+k][0],&T2=f[x][j+k][1];
if(j!=s[x] && k!=s[v]) T1=min(T1,f[x][j][0]+f[v][k][0]+(m==2)*w);
if(j!=s[x]) T1=min(T1,f[x][j][0]+f[v][k][1]);
if(k!=s[v]) T2=min(T2,f[x][j][1]+f[v][k][0]);
T2=min(T2,f[x][j][1]+f[v][k][1]+w);
}
s[x]+=s[v];
}
}
int main()
{
n=fr(),m=fr(),K=fr();
if(K+m-1>n) {puts("-1");return 0;}
for(int i=1;i<n;i++)
{
u=fr(),v=fr(),w=fr();
as[u].pb({v,w}),as[v].pb({u,w});
}
memset(f,0x3f,sizeof f);
dfs(1,-1);
fw(f[1][K][1]);
return 0;
}