1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
|
#include <bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
// 子集枚举
void enumerate_subsets(int n)
{
for (int mask = 0; mask < (1 << n); mask++)
{
bitset<32> bits(mask);
cout << "Mask " << mask << ": ";
for (int i = 0; i < n; i++)
{
if (bits.test(i))
{
cout << i << " ";
}
}
cout << endl;
}
}
// 快速统计二进制中 1 的个数
int count_ones(int x)
{
return bitset<32>(x).count();
}
// 检查是否是 2 的幂
bool is_power_of_two(int x)
{
if (x == 0)
{
return false;
}
return bitset<32>(x).count() == 1;
}
// 查找最低位的 1
int find_lowest_set_bit(int x)
{
if (x == 0)
{
return -1;
}
bitset<32> bits(x);
return bits._Find_first();
}
// 位图类
class BitMap
{
private:
bitset<1000000> bits;
public:
void set(int x)
{
bits.set(x);
}
void clear(int x)
{
bits.reset(x);
}
bool test(int x)
{
return bits.test(x);
}
int count()
{
return bits.count();
}
};
// 旅行商问题 (TSP) 状态压缩 DP
int tsp(const vector<vector<int>>& dist)
{
int n = dist.size();
int full_mask = (1 << n) - 1;
vector<vector<int>> dp(1 << n, vector<int>(n, INT_MAX));
for (int i = 0; i < n; i++)
{
dp[1 << i][i] = 0;
}
for (int mask = 0; mask < (1 << n); mask++)
{
for (int u = 0; u < n; u++)
{
if (!(mask & (1 << u)) || dp[mask][u] == INT_MAX)
{
continue;
}
for (int v = 0; v < n; v++)
{
if (!(mask & (1 << v)) && dist[u][v] != INT_MAX)
{
int new_mask = mask | (1 << v);
if (dp[new_mask][v] > dp[mask][u] + dist[u][v])
{
dp[new_mask][v] = dp[mask][u] + dist[u][v];
}
}
}
}
}
int result = INT_MAX;
for (int i = 0; i < n; i++)
{
if (dp[full_mask][i] != INT_MAX)
{
result = min(result, dp[full_mask][i] + dist[i][0]);
}
}
return result;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
// 测试子集枚举
cout << "子集枚举 (n=3): " << endl;
enumerate_subsets(3);
// 测试位统计
int x = 42; // 101010
cout << "\n二进制 " << bitset<8>(x) << " 中 1 的个数: " << count_ones(x) << endl;
cout << "是否是 2 的幂: " << is_power_of_two(x) << endl;
cout << "最低位的 1 的位置: " << find_lowest_set_bit(x) << endl;
// 测试位图
BitMap bm;
bm.set(10);
bm.set(20);
bm.set(30);
cout << "\n位图中 1 的个数: " << bm.count() << endl;
cout << "测试位 10: " << bm.test(10) << endl;
cout << "测试位 15: " << bm.test(15) << endl;
// 测试 TSP
vector<vector<int>> dist = {
{0, 10, 15, 20},
{10, 0, 35, 25},
{15, 35, 0, 30},
{20, 25, 30, 0}
};
int tsp_result = tsp(dist);
cout << "\nTSP 最短路径: " << tsp_result << endl;
return 0;
}
|