题解 [中山市选2009] 树

这题是我考场上开的第一个题……
显然可以根据灯之间的相互影响关系列出一个异或方程组
但我在考场上坚持认为有唯一解,其实并不是
这个异或方程组是可以解出自由元的
重点来了: 自由元在开关类问题中的实际意义
常规理解是某几个灯开不开均可,但灯怎么可能开或不开都不影响结果呢?
事实上,如果含有自由元,这个方程组就并没有被完全消成对角状态。
这里附上一个例子:

1:00000000000000000000000000000100000000000000000000100000000000000000000000100000000000000000000000000001010110
2:00000000000000000000000000000100000000000001000000000000000000000000000000000000000001000010001000000100001110
3:00000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000010001100
4:00000000000000000000000000000100000000000000000000000000000000000000000000000000001000010000000100000000110010
5:00000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010010100000110000
6:00000000000000000000000000000100000000000100000000000000001000000000000000000000000000000000000000000001000010
7:00000000000000000000000000000100000000000000000000010000000000000100000000000000110110000000000000000010001000
8:00000000000000000000000000000100000000000000000010000000000000000000000010000000000000100000000000001100000100
9:00000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000001011100000000
10:00000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000011000000000
11:00000000000000000000000000000100000000000000000000000000000000000000000000000000000000000001000000100000100000
12:00000000000000000000000000000100000000000000000000000000000000000000000000000101000000000100000001001000000000
13:00000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000010000000100000
14:00000000000000000000000000000100000000000000000000000000000000001000000100011000000000000000000100000000010000
15:00000000000000000000000000000100000000000000000000000000000000000000000000000000000000001000101000000000000100
16:00000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000100000
17:00000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000101000000000000000
18:00000000000000000000000000000100000000000000000000000000000000000000000000000000000000000001000000100000000000
19:00000000000000000000000000000100000000000000000000000100000000000000000000000000000000000010000000000000000100
20:00000000000000000000000000000100000000000000000000000000000000000000000000000000000000000100000001000000000000
21:00000000000000000000000000000100000000000000010000000000000010000000000000000000000000001000001000000000000000
22:00000000000000000000000000000100000010000000000000000000010000000000110000000010000000010000000000000000010000
23:00000000000000000000000000000100000000000000000000000000000000000000000000000000000000100000000000000100000000
24:00000000000000000000000000000100000000000000000000000000000000000000000000000000000001000000000000000000000100
25:00000000000000000000000000000100001000000000000000000010000000000000000000000000000010000000000000000010000000
26:00000000000000000000000000000100000000000000000001000000000000000000000000000000000100000000000000000010000000
27:00000000000000000000000000000100000000000000001000000000000000000000000000000000001000000000000000000000010000
28:00000000000000000000000000000100000000000000000000000000000000000000000000000000010000000000000000000010000000
29:00000000000000000000000000000100000000000000000100000000000000000010000000000000100000000000000000000010000000
30:00000000000000000000000000000100000000000000000000000000000100000000000001000001000000000000000001000000000000
31:00000000000000000000000000000100000000000000000000000000000000000000000000000010000000010000000000000000000000
32:00000000000000000000000000000100000000000000000000000000000000000000000000000100000000000000000001000000000000
33:00000000000000000000000000000100000000000000000000000000000000000000000000001000000000000000000100000000000000
34:00000000000000000000000000000100000000000000000000000000100000010000000000010000000000000000000100000000000000
35:00000000000000000000000000000100000000000000000000000000000000000000001000100000000000000000000000000000000010
36:00000000000000000000000000000100000000000000000000000000000000000001000001000001000000000000000000000000000000
37:00000000000000000000000000000100000000000000000000000000000000000000000010000000000000000000000000000100000000
38:00000000000000000000000000000100000000000000000000000000000000000000000100000000000000000000000100000000000000
39:00000000000000000000000000000100000000000000000000000000000000000000001000100000000000000000000000000000000000
40:00000000000000000000000000000100000000000000000000000000000000000000010000000000000000010000000000000000000000
41:00000000000000000000000000000100000000000000000000000000000000000000100000000000000000010000000000000000000000
42:00000000000000000000000000000100100000000000000000000000000000000001000001000000000000000000000000000000000000
43:00000000000000000000000000000100000000000000000000000000000000000010000000000000100000000000000000000000000000
44:00000000000000000000000000000100010000000000000000000000000000000100000000000000000000000000000000000010000000
45:00000000000000000000000000000100000000000000000000001000000000001000000000000000000000000000000100000000000000
46:00000000000000000000000000000100000000000000000000000001000000010000000000010000000000000000000000000000000000
47:00000000000000000000000000000100000000000010000000000000000001100000000000000000000000000000100000000000000000
48:00000000000000000000000000000100000000000000000000000000000001100000000000000000000000000000000000000000000000
49:00000000000000000000000000000100000000000000000000000000000010000000000000000000000000001000000000000000000000
50:00000000000000000000000000000100000000000000000000000000000100000000000000000001000000000000000000000000000000
51:00000000000000000000000000000100000001000000000000000000001000000000000000000000000000000000000000000001000000
52:00000000000000000000000000000100000000000000000000000000010000000000000000000000000000010000000000000000000000
53:00000000000000000000000000000100000000000000100000000000100000000000000000010000000000000000000000000000000000
54:00000000000000000000000000000100000000010000000000000001000000010000000000000000000000000000000000000000000000
55:00000000000000000000000000000100000000000000000000000010000000000000000000000000000010000000000000000000000000
56:00000000000000000000000000000110000000000000000000000100000000000000000000000000000000000010000000000000000000
57:00000000000000000000000000000101000000000000000000001000000000001000000000000000000000000000000000000000000000
58:00000000000000000000000000000100000000000000000000010000000000000000000000000000000000000000000000000010000000
59:00000000000000000000000000000100000000000000000000100000000000000000000000000000000000000000000000000000000010
60:00000000000000000000000000000100000000000000000001000000000000000000000000000000000100000000000000000000000000
61:00000000000000000000000000000100000000000000000010000000000000000000000000000000000000000000000000000100000000
62:00000000000000000000000000000100000000000000000100000000000000000000000000000000100000000000000000000000000000
63:00000000000000000000000000000100000000100000001000000000000000000000000000000000001000000000000000000000000000
64:00000000000000000000000000000100000100000000010000000000000000000000000000000000000000001000000000000000000000
65:00000000000000000000000000000100000000000000100000000000100000000000000000000000000000000000000000000000000000
66:00000000000000000000000000000100000000000001000000000000000000000000000000000000000000000000000000000000000100
67:00000000000000000000000000000100000000000010000000000000000000100000000000000000000000000000000000000000000000
68:00000000000000000000000000000100000000001100000000000000000000000000000000000000000000000000000000000001000000
69:00000000000000000000000000000100000000001100000000000000000000000000000000000000000000000000000000000000000000
70:00000000000000000000000000000100000000010000000000000001000000000000000000000000000000000000000000000000000000
71:00000000000000000000000000000100000000100000001000000000000000000000000000000000000000000000000000000000000000
72:00000000000000000000000000000100000001000000000000000000001000000000000000000000000000000000000000000000000000
73:00000000000000000000000000000100000010000000000000000000000000000000000000000000000000010000000000000000000000
74:00000000000000000000000000000100000100000000010000000000000000000000000000000000000000000000000000000000000000
75:00000000000000000000000000000100001000000000000000000000000000000000000000000000000010000000000000000000000000
76:00000000000000000000000000000100010000000000000000000000000000000100000000000000000000000000000000000000000000
77:00000000000000000000000000000100100000000000000000000000000000000001000000000000000000000000000000000000000000
78:00000000000000000000000000000101000000000000000000001000000000000000000000000000000000000000000000000000000000
79:00000000000000000000000000000110000000000000000000000100000000000000000000000000000000000000000000000000000000

1:00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010
2:00000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000100
3:00000000000000000000000000000110000000000000000000000000000000000000000000000000000000000000000000000000001000
4:00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000
5:00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000
6:00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000
7:00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000
8:00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000
9:00000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000001000000000
10:00000000000000000000000000000110000000000000000000000000000000000000000000000000000000000000000000010000000000
11:00000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000100000000000
12:00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000
13:00000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000010000000000000
14:00000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000100000000000000
15:00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000
16:00000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000
17:00000000000000000000000000000110000000000000000000000000000000000000000000000000000000000000100000000000000000
18:00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000
19:00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000
20:00000000000000000000000000000100000000000000000000000000000000000000000000000000000000000100000000000000000000
21:00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000
22:00000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000
23:00000000000000000000000000000100000000000000000000000000000000000000000000000000000000100000000000000000000000
24:00000000000000000000000000000110000000000000000000000000000000000000000000000000000001000000000000000000000000
25:00000000000000000000000000000100000000000000000000000000000000000000000000000000000010000000000000000000000000
26:00000000000000000000000000000110010000000000000000000000000000000000000000000000000100000000000000000000000000
27:00000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000
28:00000000000000000000000000000100000000000000000000000000000000000000000000000000010000000000000000000000000000
29:00000000000000000000000000000100000000000000000000000000000000000000000000000000100000000000000000000000000000
30:00000000000000000000000000000110000000000000000000000000000000000000000000000001000000000000000000000000000000
31:00000000000000000000000000000100000000000000000000000000000000000000000000000010000000000000000000000000000000
32:00000000000000000000000000000100000000000000000000000000000000000000000000000100000000000000000000000000000000
33:00000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000
34:00000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000
35:00000000000000000000000000000010000000000000000000000000000000000000000000100000000000000000000000000000000000
36:00000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000
37:00000000000000000000000000000100000000000000000000000000000000000000000010000000000000000000000000000000000000
38:00000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000
39:00000000000000000000000000000110000000000000000000000000000000000000001000000000000000000000000000000000000000
40:00000000000000000000000000000100000000000000000000000000000000000000010000000000000000000000000000000000000000
41:00000000000000000000000000000100000000000000000000000000000000000000100000000000000000000000000000000000000000
42:00000000000000000000000000000010000000000000000000000000000000000001000000000000000000000000000000000000000000
43:00000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000
44:00000000000000000000000000000100010000000000000000000000000000000100000000000000000000000000000000000000000000
45:00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000
46:00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000
47:00000000000000000000000000000010000000000000000000000000000000100000000000000000000000000000000000000000000000
48:00000000000000000000000000000110000000000000000000000000000001000000000000000000000000000000000000000000000000
49:00000000000000000000000000000100000000000000000000000000000010000000000000000000000000000000000000000000000000
50:00000000000000000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000
51:00000000000000000000000000000100000001000000000000000000001000000000000000000000000000000000000000000000000000
52:00000000000000000000000000000100000000000000000000000000010000000000000000000000000000000000000000000000000000
53:00000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000
54:00000000000000000000000000000100000000000000000000000001000000000000000000000000000000000000000000000000000000
55:00000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000
56:00000000000000000000000000000110000000000000000000000100000000000000000000000000000000000000000000000000000000
57:00000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000
58:00000000000000000000000000000100000000000000000000010000000000000000000000000000000000000000000000000000000000
59:00000000000000000000000000000100000000000000000000100000000000000000000000000000000000000000000000000000000000
60:00000000000000000000000000000010010000000000000001000000000000000000000000000000000000000000000000000000000000
61:00000000000000000000000000000100000000000000000010000000000000000000000000000000000000000000000000000000000000
62:00000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000
63:00000000000000000000000000000100000000000000001000000000000000000000000000000000000000000000000000000000000000
64:00000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000
65:00000000000000000000000000000100000000000000100000000000000000000000000000000000000000000000000000000000000000
66:00000000000000000000000000000110000000000001000000000000000000000000000000000000000000000000000000000000000000
67:00000000000000000000000000000110000000000010000000000000000000000000000000000000000000000000000000000000000000
68:00000000000000000000000000000000000001000100000000000000000000000000000000000000000000000000000000000000000000
69:00000000000000000000000000000100000001001000000000000000000000000000000000000000000000000000000000000000000000
70:00000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000
71:00000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000
72:00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
73:00000000000000000000000000000100000010000000000000000000000000000000000000000000000000000000000000000000000000
74:00000000000000000000000000000100000100000000000000000000000000000000000000000000000000000000000000000000000000
75:00000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000
76:00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
77:00000000000000000000000000000110100000000000000000000000000000000000000000000000000000000000000000000000000000
78:00000000000000000000000000000101000000000000000000000000000000000000000000000000000000000000000000000000000000
79:00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
none:72
none:76
none:79
40

这里上面的是列出来的异或方程组,下面是消元结果
可以注意到,自由元所对应的系数并没有被消干净
也就是说,开关类问题中的自由元不是指开或不开不对结果造成影响的开关
而是指开或不开都对应着一组可行且两两互异的解的开关
所以对于此题,枚举每个自由开关的状态并dfs回带即可

Code:

#include <bits/stdc++.h>
using namespace std;
#define N 110
#define ll long long 
//#define int long long 

inline int read() {
	int ans=0, f=1; char c=getchar();
	while (!isdigit(c)) {if (c=='-') f=-f; c=getchar();}
	while (isdigit(c)) {ans=(ans<<3)+(ans<<1)+(c^48); c=getchar();}
	return ans*f;
}

int n, ans;
bitset<N> mat[N];

int dfs(int i, const bitset<N> base[]) {
	//cout<<"dfs "<<i<<endl;
	int ans=0;
	bitset<N> mat[n+2];
	for (int j=1; j<=n; ++j) mat[j]=base[j];
	//for (int i=1; i<=n; ++i) cout<<i<<' '<<mat[i]<<endl;
	if (i) {
		for (int j=1; j<=n; ++j) if (i!=j && mat[j][i]) mat[j]^=mat[i]; //, cout<<1<<endl;
		//for (int i=1; i<=n; ++i) cout<<i<<' '<<mat[i]<<endl;
	}
	else i=1;
	for (int j=1; j<=n; ++j) if (mat[j][n+1]) ++ans;
	for (++i; i<=n; ++i) if (!mat[i][i]) {
		mat[i][i]=1;
		ans = min(ans, dfs(i, mat));
		mat[i][n+1]=1;
		ans = min(ans, dfs(i, mat));
	}
	//cout<<"return "<<ans<<endl;
	return ans;
}

int main()
{
	#ifdef DEBUG
	freopen("1.in", "r", stdin);
	#endif
	
	while (1) {
		n=read(), ans=0;
		if (!n) return 0;
		for (int i=1; i<=n; ++i) mat[i].reset();
		for (int i=1,u,v; i<n; ++i) {
			u=read(); v=read();
			//cout<<u<<' '<<v<<endl;
			mat[u][v]=1; mat[v][u]=1;
		}
		for (int i=1; i<=n; ++i) {mat[i][i]=1; mat[i][n+1]=1;}
		//for (int i=1; i<=n; ++i) cout<<i<<' '<<mat[i]<<endl; cout<<endl;
		
		for (int i=1; i<=n; ++i) {
			for (int j=i; j<=n; ++j) if (mat[j][i]) {swap(mat[i], mat[j]); break;}
			//for (int j=i+1; j<=n; ++j) if (mat[j][i]) mat[j]^=mat[i];
			for (int j=1; j<=n; ++j) if (i!=j && mat[j][i]) mat[j]^=mat[i];
		}
		//for (int i=1; i<=n; ++i) cout<<i<<' '<<mat[i]<<endl;
		
		printf("%d\n", dfs(0, mat));
	}

	return 0;
}

然而这里还有一个问题:
此题高斯消元的解法时间复杂度是假的
实际复杂度是\(O(n^3+2^k)\)\(k\)是自由元个数
所以这题还有树形DP写法
yysy,树形DP写法调得我头都大了
怎么我现在一见到这种相互影响的问题就日均靠调参做题啊。。。
\(dp[i][]\)指的是第i个点在其子树全亮时自身状态

Code:

#include <bits/stdc++.h>
using namespace std;
#define INF 110
#define N 110
#define ll long long 
#define ld long double
#define usd unsigned
#define ull unsigned long long
//#define int long long 

#define _00 0
#define _01 1
#define _10 2
#define _11 3

// _11->按,亮 _10->按,不亮 _01->不按,亮 _00->不按,不亮

struct edge{int to, next;}e[N<<1];
int n;
int head[N], size, cnt[N], dp[N][4];
const int leaf[4]={0, INF, INF, 1};

inline void add(int s, int t) {edge *k=&e[++size]; k->to=t; k->next=head[s]; head[s]=size;}

void dfs(int u, int in_edge) {
	//cout<<"dfs "<<u<<' '<<in_edge<<endl;
	in_edge ^= 1;
	if (cnt[u]==1 && u!=1) {memcpy(dp[u], leaf, sizeof(leaf)); return;}
	
	memset(dp[u], 0, sizeof(leaf));
	int now1=0, minw1=INF;
	int now2=1, minw2=INF;
	int t1=0, t2=0;
	for (int i=head[u],v; i; i=e[i].next) {
		if (i==in_edge) continue;
		v = e[i].to;
		dfs(v, i);
		
		if (dp[v][_11] < dp[v][_01]) {t1+=dp[v][_11]; now1^=1; minw1=min(minw1, dp[v][_01]-dp[v][_11]);}
		else {t1+=dp[v][_01]; minw1=min(minw1, dp[v][_11]-dp[v][_01]);}
		
		if (dp[v][_10] < dp[v][_00]) {t2+=dp[v][_10]; now2^=1; minw2=min(minw2, dp[v][_00]-dp[v][_10]);}
		else {t2+=dp[v][_00]; minw2=min(minw2, dp[v][_10]-dp[v][_00]);}
	}
	
	//cout<<"return "<<u<<' '<<t1<<' '<<minw1<<' '<<t2<<' '<<minw2<<endl;
	dp[u][now1]=t1; dp[u][now1^1]=t1+minw1;
	dp[u][1<<1|now2]=t2; dp[u][1<<1|(now2^1)]=t2+minw2;
	++dp[u][_11]; ++dp[u][_10];
}

signed main()
{
	#ifdef DEBUG
	freopen("1.in", "r", stdin);
	#endif
	
	while (1) {
		memset(dp, 0, sizeof(dp));
		memset(head, 0, sizeof(head));
		memset(e, 0, sizeof(e));
		memset(cnt, 0, sizeof(cnt));
		size = 1;
		
		scanf("%d", &n);
		if (!n) return 0;
		for (int i=1,u,v; i<n; ++i) {scanf("%d%d", &u, &v); add(u, v); add(v, u); ++cnt[u]; ++cnt[v];}
		dfs(1, 0);
		printf("%d\n", min(dp[1][_11], dp[1][_01]));
		//for (int i=1; i<=n; ++i) {for (int j=0; j<4; ++j) cout<<dp[i][j]<<' '; cout<<endl;}
	}

	return 0;
}

posted @ 2021-05-26 12:13  Administrator-09  阅读(38)  评论(0编辑  收藏  举报