考场上打的dfs+玄学剪枝居然过了
查看原帖
考场上打的dfs+玄学剪枝居然过了
752257
Miangoa楼主2023/8/7 09:24
#include<bits/stdc++.h>
#define int long long

using namespace std;

int n,h[1500001],e[3000001][2],cnt,sum,col[1500001],all;
struct nod {
	int d,b;
} d[1500001];

inline int read() {
	int f=1,x=0;
	char ch=getchar();
	while(ch<'0'||ch>'9') {
		if(ch=='-')
			f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9') {
		x=x*10+ch-'0';
		ch=getchar();
	}
	return f*x;
}

void add(int x,int y) {
	e[++cnt][0]=y;
	e[cnt][1]=h[x];
	h[x]=cnt;
}

void init() {
	n=read();
	for(register int i=1; i<n; i++) {
		int x=read(),y=read();
		add(x,y);
		add(y,x);
	}
	d[1].d=1;
}

bool cmp(nod a,nod b) {
	return a.d>b.d;
}

void dfs(int p) {
	for(register int i=h[p]; i; i=e[i][1])
		if(!d[e[i][0]].d) {
			d[e[i][0]].d=d[p].d+1;
			dfs(e[i][0]);
		}
	all+=d[p].d;
	d[p].b=p;
}

bool find(int p) {
	if(sum>all/2)
		return false;
	if(sum==all/2) {
		for(register int i=p; i<=n; i++)
			col[d[i].b]=0;
		return true;
	}
	if(p>n)
		return false;
	sum+=d[p].d;
	if(find(p+1)) {
		col[d[p].b]=1;
		return true;
	}
	sum-=d[p].d;
	if(find(p+1)) {
		col[d[p].b]=0;
		return true;
	}
	return false;
}

signed main() {
	init();
	dfs(1);
	if(all%2==1)
		cout<<-1;
	else {
		sort(d+1,d+1+n,cmp);
		if(find(1))
			for(register int i=1; i<=n; i++)
				cout<<col[i]<<' ';
		else
			cout<<-1;
	}
}
2023/8/7 09:24
加载中...