关于刚才div2t3
  • 板块学术版
  • 楼主Enoch006
  • 当前回复7
  • 已保存回复7
  • 发布时间2023/8/5 18:13
  • 上次更新2023/11/3 05:42:37
查看原帖
关于刚才div2t3
538683
Enoch006楼主2023/8/5 18:13

蒟蒻上完课五点多钟了,回来想打比赛断断续续的打,看到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;
}
2023/8/5 18:13
加载中...