#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
char v[N][5], a[N];
int x[N], y[N], n, m;
namespace sub1 {
char b[N], c[N];
int ans = 1e9;
bool check() {
for (int i = 1; i <= n; i++) c[i] = b[i];
for (int i = 1; i <= m; i++) {
if (v[i][0] == 'F' || v[i][0] == 'T' || v[i][0] == 'U') {
c[x[i]] = v[i][0];
}
else if (v[i][0] == '+') {
c[x[i]] = c[y[i]];
}
else {
char tmp = c[y[i]];
if (tmp == 'T') tmp = 'F';
else if (tmp == 'F') tmp = 'T';
c[x[i]] = tmp;
}
}
for (int i = 1; i <= n; i++) {
if (b[i] != c[i]) return false;
}
return true;
}
void dfs(int cnt) {
if (cnt == n + 1) {
if (check()) {
int flag = 0;
for (int i = 1; i <= n; i++) {
if (b[i] == 'U') flag++;
}
ans = min(ans, flag);
}
return ;
}
b[cnt] = 'T';
dfs(cnt + 1);
b[cnt] = 'F';
dfs(cnt + 1);
b[cnt] = 'U';
dfs(cnt + 1);
}
void solve() {
dfs(1);
printf("%d\n", ans);
}
}
int main() {
int c, t;
scanf("%d%d", &c, &t);
while(t--) {
scanf("%d%d", &n, &m);
for (int i = 1; i <= m; i++) {
scanf("%s", v[i]);
if (v[i][0] == '+' || v[i][0] == '-') {
scanf("%d%d", &x[i], &y[i]);
}
else scanf("%d", &x[i]);
}
if (c == 1 || c == 2) sub1::solve();
}
return 0;
}
这份代码,先不要管复杂度的问题
对于这个数据
1 3
3 3
- 2 1
- 3 2
+ 1 3
3 3
- 2 1
- 3 2
- 1 3
2 2
T 2
U 2
实测一个一个测试是可以过的,但是多测就出问题了,看了半天觉得代码都是直接覆盖值的也不知道哪里需要清空啊
求助QAQ