求调
#include <iostream>
using namespace std;
struct kkk{
bool can;
bool jyh;
};
int f=1,maxx=0;
bool b[500][500]={},fwg[500]={};
int sd[500]={},n;
void dfs(int m){
sd[m]=f;
f++;
if(maxx<f){
maxx=f;
}
fwg[m]=1;
for(int i=1;i<=n;i++){
if(b[i][m]&&!fwg[i]){
dfs(i);
}
}
f--;
}
int main(){
int u,v,sum=0;
cin>>n;
for(int i=0;i<n-1;i++){
cin>>u>>v;
b[u][v]=1;
b[v][u]=1;
}
dfs(1);
for(int i=1;i<=n;i++){
sum+=sd[i];
}
if(sum&1){
cout<<-1;
return 0;
}
if(n<2){
cout<<-1;
return 0;
}
if((maxx*2)>sum){
cout<<-1;
return 0;
}
kkk dp[n][sum/2+1]={};
for(int i=0;i<n;i++){
dp[i][0].can=1;
}
dp[0][sd[0]].can=1;
dp[0][sd[0]].jyh=1;
for(int i=1;i<=n;i++){
for(int j=1;j<=sum/2;j++){
if(sd[i]<=j){
dp[i][j].can=dp[i-1][j].can||dp[i-1][j-sd[i]].can;
if(dp[i-1][j-sd[i]].can){
dp[i][j].jyh=1;
}
}
else{
dp[i][j].can=dp[i-1][j].can;
}
}
}
if(!(dp[n-1][sum/2].can)){
cout<<-1;
return 0;
}
int p1=n-1,p2=sum/2;
short ans[n+1]={};
while(p1>0){
if(dp[p1][p2].jyh){
ans[p1]=1;
p1--;
p2-=sd[p1+1];
}
else{
p1--;
}
}
for(int i=1;i<=n;i++){
cout<<ans[i]<<" ";
}
return 0;
}
数组再大点就MLE,但是现在只能拿到前三个Subtask的分数。
第一次打dfs,勿喷。