蒟蒻上完课五点多钟了,回来想打比赛断断续续的打,看到T3我的思路是先求出每个点的深度再dp找出方案行不行,但我不会找方案,只会判断,求告诉思路。
写到一半的代码:
#include <bits/stdc++.h>
#define int long long
#define maxm 100005
#define maxn 1005
using namespace std;
int n,m,x,y,sum,maxx,cnt,vis[maxm],vst[maxm],dep[maxm],dp[maxm],h[maxm];
struct node{
int to,nex;
}edge[maxm];
void add(int x,int y){
edge[++cnt].to=y;
edge[cnt].nex=h[x];
h[x]=cnt;
}
void dfs(int x,int d){
dep[x]=d;
vis[x]=1;
for(int i=h[x];i;i=edge[i].nex){
int y=edge[i].to;
if(!vis[y]){
dfs(y,d+1);
}
}
}
signed main(){
scanf("%lld",&m);
for(int i=1;i<m;i++){
scanf("%lld%lld",&x,&y);
add(x,y);
add(y,x);
}
dfs(1,1);
for(int i=1;i<=m;i++){
sum+=dep[i];
maxx=max(maxx,dep[i]);
}
if(m<2||sum%2!=0||maxx>(sum/2)){
cout<<-1;
return 0;
}
sum/=2;
for(int i=1;i<=m;i++)
for(int j=sum;j>=dep[i];j--){
if(dp[j-dep[i]]+dep[i]>dp[j]){
dp[j]=dp[j-dep[i]]+dep[i];
if(j==sum)vst[i]=1;
}
}
if(dp[sum]!=sum){
cout<<-1;
return 0;
}
for(int i=1;i<=m;i++){
cout<<vst[i]<<" ";
}
return 0;
}