同样的方法…我200ms,他2000ms.
常数的幽怨…
CODE
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 505;
const double eps = 1e-8;
struct Point {
double x, y;
Point(){}
Point(double x, double y):x(x), y(y){}
inline Point operator -(const Point &o)const { return Point(x-o.x, y-o.y); }
inline double operator *(const Point &o)const { return x*o.y - y*o.x; }
}a[MAXN], b[MAXN];
struct Line {
Point p, v;
Line(){}
Line(const Point &p, const Point &v):p(p), v(v){}
};
inline bool On_Right(const Line &l, const Point &p) {
return (p - l.p) * l.v > eps;
}
inline int dcmp(const double &x) {
return x < -eps ? -1 : x < eps ? 0 : 1;
}
int m, n, f[MAXN][MAXN];
int main () {
scanf("%d%d", &m, &n); double o;
for(int i = 1; i <= m; ++i) scanf("%lf%lf%lf", &a[i].x, &a[i].y, &o);
for(int i = 1; i <= n; ++i) scanf("%lf%lf%lf", &b[i].x, &b[i].y, &o);
for(int i = 1; i <= m; ++i) {
for(int j = 1; j <= m; ++j)
f[i][j] = m+1;
bool flg = 1;
for(int j = 1; j <= n && flg; ++j)
if(dcmp(b[j].x-a[i].x) || dcmp(b[j].y-a[i].y)) flg = 0;
if(flg) return puts("1"), 0;
}
for(int i = 1; i <= m; ++i)
for(int j = 1; j <= m; ++j)
if(i != j && !(a[i].x == a[j].x && a[i].y == a[j].y)) { //i->j
Line tmp = Line(a[i], a[j] - a[i]);
bool flg = 1;
for(int k = 1; k <= n && flg; ++k)
if(On_Right(tmp, b[k])) flg = 0;
if(flg) {
for(int k = 1; k <= n && flg; ++k)
if
(
(!dcmp((b[k] - tmp.p) * tmp.v))
&&
((b[k].x < a[i].x && b[k].x < a[j].x)
|| (b[k].x > a[i].x && b[k].x > a[j].x)
|| (b[k].y < a[i].y && b[k].y < a[j].y)
|| (b[k].y > a[i].y && b[k].y > a[j].y)
)
) flg = 0;
if(flg) f[i][j] = 1;
}
}
for(int k = 1; k <= m; ++k)
for(int i = 1; i <= m; ++i) if(f[i][k] <= m)
for(int j = 1; j <= m; ++j) if(f[k][j]+f[i][k] <= m)
f[i][j] = min(f[i][j], f[i][k] + f[k][j]);
int ans = m+1;
for(int i = 1; i <= m; ans = min(ans, f[i][i]), ++i);
printf("%d
", ans > m ? -1 : ans);
}