代码如下
#include <cstdio>
#include <queue>
#include <cstring>
#define min(A, B) (A < B ? A : B)
#define abs(x) (x < 0 ? -(x) : x)
#define lowbit(x) (x & -x)
const int MX = 20;
double x[MX], y[MX];
namespace DP
{
int f[1 << MX], sht[MX][MX];
bool vis[1 << MX];
std::pair <double, double> fun(double x1, double y1, double x2, double y2)
{
double a = (x2 * y1 - x1 * y2) / (x1 * x2 * (x1 - x2));
return { a, (y1 - x1 * x1 * a) / x1 };
}
inline bool equal(double a, double b)
{
return abs(a - b) < 1e-7;
}
void exec(int n)
{
std::pair <double, double> pr;
for (int i = 0; i < n; i++)
{
sht[i][i] = 1 << i;
for (int j = i + 1; j < n; j++)
{
pr = fun(x[i], y[i], x[j], y[j]);
sht[i][j] = 0;
if (pr.first < 0)
{
for (int k = 0; k < n; k++)
{
if (equal(pr.first * x[k] * x[k] + pr.second * x[k], y[k]))
{
sht[i][j] |= (1 << k);
}
}
}
}
}
}
inline void minx(int& a, int b)
{
a = min(a, b);
}
int DP(int n)
{
memset(f, 0x3f, sizeof(int) * (1 << n));
memset(vis, 0, sizeof(bool) * (1 << n));
exec(n);
std::queue <int> q;
q.push((1 << n) - 1);
f[(1 << n) - 1] = 0;
vis[0] = true;
int t;
while (not q.empty())
{
t = q.front();
q.pop();
for (int i, t1 = t; (i = __builtin_ctz(t1)), t1; t1 -= lowbit(t1))
{
for (int j, t2 = t1; (j = __builtin_ctz(t2)), t2; t2 -= lowbit(t2))
{
minx(f[t & (~sht[i][j])], f[t] + 1);
if (not vis[t & (~sht[i][j])])
{
vis[t & (~sht[i][j])] = true;
q.push(t & (~sht[i][j]));
}
}
}
}
}
}
int main()
{
int t, n;
scanf("%d", &t);
while (t--)
{
scanf("%d%*d", &n);
for (int i = 0; i < n; i++)
{
scanf("%lf%lf", x + i, y + i);
}
DP::DP(n);
printf("%d\n", DP::f[0]);
}
}
RE信息
Runtime Error.
Received signal 6: Aborted / IOT trap.