关于昨天Div 2 T3
  • 板块灌水区
  • 楼主fe117
  • 当前回复16
  • 已保存回复16
  • 发布时间2023/8/6 09:48
  • 上次更新2023/11/3 05:38:13
查看原帖
关于昨天Div 2 T3
1025217
fe117楼主2023/8/6 09:48

求调

#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,勿喷。

2023/8/6 09:48
加载中...