题解 [中山市选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;
}