虽然但是:我n^2 * (2^n) 也过了 —— 确实 思考状压DP实际上的思路就是DFS的思路
P2831 [NOIP2016 提高组] 愤怒的小鸟 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6+15;
const int mo = 998244353;
#define pb push_back
#define pii pair<int,int>
#define ft first
#define sd second
#define ffor(i,a,b,c) for(int i=(a);i<(b);i+=(c))
#define For(i,a,b,c) for(int i=(a);i<=(b);i+=(c))
#define rfor(i,a,b,c) for(int i=(a);i>(b);i-=(c))
#define Rfor(i,a,b,c) for(int i=(a);i>=(b);i-=(c))
#define all(x) (x).begin(), (x).end()
#define debug1(x) cerr<<"! "<<x<<endl;
#define debug2(x,y) cerr<<"# "<<x<<" "<<y<<endl;
#define db double
#define pdd pair<double, double>
const double eps = 1e-7;
pdd cal (pdd x, pdd y) {
db x1 = (x.ft * y.sd - y.ft * x.sd) /((x.ft * y.ft) * (y.ft - x.ft));
db y1 = (x.sd - x1 * x.ft * x.ft) / x.ft;
return {x1, y1};
}
bool equal (pdd x, pdd y) {
if (fabs(x.ft - y.ft) < eps && fabs(x.sd - y.sd) < eps) return true;
return false;
}
void slv(){
int n, m; cin >> n >> m;
vector<pdd> pos(n + 1);
for (int i = 1; i <= n; i++) {
cin >> pos[i].ft >> pos[i].sd;
}
int mx = (1 << n) - 1;
vector<vector<int>> line(n + 1, vector<int>(n + 1));
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (i == j) continue;
if (pos[i].ft == pos[j].ft) continue;
if (pos[i].ft * pos[j].sd - pos[i].sd * pos[j].ft < eps) continue;
pdd tmp = cal(pos[i], pos[j]);
if (tmp.ft > 0) continue;
int now = 0;
now |= 1 << (i - 1);
now |= 1 << (j - 1);
for (int k = 1; k <= n; k++) {
if (k == i || k == j) continue;
if (equal(tmp, cal(pos[i], pos[k]))) {
now |= 1 << (k - 1);
}
}
line[i][j] = now;
}
}
// for (int i = 1; i <= n; i++) {
// for (int j = 1; j <= n; j++) {
// cout << line[i][j] << ' ';
// }
// cout << '\n';
// }
#define inf 1e9
vector<int> f(1 << n + 1, inf);
f[0] = 0;
for (int i = 0; i <= mx; i++) {
for (int j = 1; j <= n; j++) {
if (!(i & (1 << (j - 1)))) {
for (int k = 1; k <= n; k++) {
if (j != k) {
int sta = line[j][k];
// assert(sta | i <= mx);
f[sta | i] = min(f[sta | i], f[i] + 1);
}
}
int sta = 1 << (j - 1);
f[sta | i] = min(f[sta | i], f[i] + 1);
}
}
}
cout << f[mx] << '\n';
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);
int t;cin>>t;
while(t--){
slv();
}
}