85pts 求助
查看原帖
85pts 求助
767295
hfjqwq楼主2023/8/5 20:23
#include<bits/stdc++.h>
#define re register int
#define ll long long
#define ull unsigned long long
const int inf=0x3f3f3f3f,maxn=1e6+7;
using namespace std;
int n,depth[maxn];
vector<int> G[maxn];
bool vis[maxn],flag;
ll sum;
int read(){
	int ret=0,sgn=0; char ch=getchar();
	while(!isdigit(ch)) sgn |= ch == '-', ch = getchar();
	while(isdigit(ch)) ret = ret*10 + ch-'0', ch = getchar();
	return sgn ? -ret : ret;
}
void dfs(int x,int fa){
	depth[x]=depth[fa]+1;
	for(int i=0;i<(int)G[x].size();i++){
		int to=G[x][i];
		if(to==fa) continue;
		dfs(to,x);
	}
}
void dfs2(int pos,int cur){
	if(cur==sum/2){
		for(int i=1;i<=n;i++){
			if(vis[i]) printf("1 ");
			else printf("0 ");
		}
		flag=true;
		return;
	}
	if(pos==n+1) return;
	if(cur>sum/2) return;
	if(flag) return;
	vis[pos]=1;
	dfs2(pos+1,cur+depth[pos]);
	vis[pos]=0;
	dfs2(pos+1,cur);
}
int main(){
	n=read();
	for(int i=1;i<=n-1;i++){
		int u=read(),v=read();
		G[u].push_back(v); G[v].push_back(u);
	}
	dfs(1,0);
	for(int i=1;i<=n;i++){
		sum+=depth[i];
	}
	if(sum%2==1){
		printf("-1\n"); return 0;
	}
	dfs2(1,0);
	return 0;
}

思路就是正常记录深度,然后 dfs 枚举 visvis 数组,当枚举到总深度除以 2 的时候输出答案。TLE 了几个点,这是 评测记录

2023/8/5 20:23
加载中...