线段相交加并查集。
#include <cstdio>
#include <cmath>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const double eps = 1e-10;
struct P
{
double x, y;
P() {}
P(double x, double y) : x(x), y(y) {}
int dcmp(double k)
{
if(fabs(k) < eps) return 0;
else return x < 0 ? -1 : 1;
}
P operator + (const P &q)
{
return P(x + q.x, y + q.y);
}
P operator - (const P &q)
{
return P(x - q.x, y - q.y);
}
P operator * (const double &d)
{
return P(x * d, y * d);
}
bool operator == (const P &q)
{
return dcmp(x - q.x) == 0 && dcmp(y - q.y) == 0;
}
double dot(const P &q)
{
return x * q.x + y * q.y;
}
double det(const P &q)
{
return x * q.y - y * q.x;
}
};
P start[200], fine[200];
int pre[200], rankc[200];
void init()
{
int i;
memset(start, 0, sizeof(start));
memset(fine, 0, sizeof(fine));
memset(rankc, 0, sizeof(rankc));
for(i = 0; i <= 190; ++i)
{
pre[i] = i;
}
return ;
}
inline bool on_point(P p, P q)
{
return p == q;
}
inline bool on_seg(P p1, P p2, P q)
{
return (q - p1).det(p2 - q) == 0 && (q - p1).dot(p2 - q) >= 0;
}
inline bool on_inster(P p1, P p2, P q1, P q2)
{
return ((p1 - q2).det(q1 - q2)) * ((q1 - q2).det(p2 - q2)) > 0 && ((q1 - p2).det(p1 - p2)) * ((p1 - p2).det(q2 - p2)) > 0;
}
int findc(int x)
{
if(x != pre[x])
{
return pre[x] = findc(pre[x]);
}
else return pre[x];
}
void unionc(int x, int y)
{
x = findc(x), y = findc(y);
if(x == y) return ;
else
{
if(rankc[x] < rankc[y])
{
pre[x] = y;
}
else
{
pre[y] = x;
if(rankc[x] == rankc[y])
{
rankc[x] += 1;
}
}
}
return ;
}
int main()
{
int n, i, j, k;
while(scanf("%d", &n) != EOF)
{
if(n == 0) break;
init();
for(i = 1; i <= n; ++i)
{
scanf("%lf %lf %lf %lf", &start[i].x, &start[i].y, &fine[i].x, &fine[i].y);
}
for(i = 1; i <= n; ++i)
{
for(j = i + 1; j <= n; ++j)
{
if(on_point(start[i], start[j]) || on_point(start[i], fine[j]) ||
on_point(fine[i], start[j]) || on_point(fine[i], fine[j]))
{
unionc(i, j);
}
else if(on_seg(start[i], fine[i], start[j]) || on_seg(start[i], fine[i], fine[j]) ||
on_seg(start[j], fine[j], start[i]) || on_seg(start[j], fine[j], fine[i]))
{
unionc(i, j);
}
else if(on_inster(start[i], fine[i], start[j], fine[j]))
{
unionc(i, j);
}
}
}
while(1)
{
int a, b;
scanf("%d %d", &a, &b);
if(a == 0 && b == 0) break;
if(findc(a) == findc(b)) printf("CONNECTED\n");
else printf("NOT CONNECTED\n");
}
}
return 0;
}
746

被折叠的 条评论
为什么被折叠?



