poj1127

floyd+几何计算

线段相交

View Code
#include <iostream>
#include
<cstdlib>
#include
<cstring>
#include
<cstdio>
using namespace std;

#define maxn 20
#define zero(x) (((x)>0?(x):-(x))<eps)
#define eps 1.0E-8

struct Point
{
double x, y;
};

struct Line
{
Point a, b;
} straw[maxn];

bool g[maxn][maxn];
int n;

void input()
{
for (int i = 0; i < n; i++)
scanf(
"%lf%lf%lf%lf", &straw[i].a.x, &straw[i].a.y, &straw[i].b.x, &straw[i].b.y);
}

double xmult(Point p1, Point p2, Point p0)
{
return (p1.x - p0.x) * (p2.y - p0.y) - (p2.x - p0.x) * (p1.y - p0.y);
}

int dots_inline(Point p1, Point p2, Point p3)
{
return zero(xmult(p1, p2, p3));
}

int same_side(Point p1, Point p2, Line l)
{
return xmult(l.a, p1, l.b) * xmult(l.a, p2, l.b) > eps;
}

int dot_online_in(Point p, Line l)
{
return zero(xmult(p, l.a, l.b)) && (l.a.x - p.x) * (l.b.x - p.x) < eps && (l.a.y - p.y) * (l.b.y - p.y) < eps;
}

int intersect_in(Line u, Line v)
{
if (!dots_inline(u.a, u.b, v.a) || !dots_inline(u.a, u.b, v.b))
return !same_side(u.a, u.b, v) && !same_side(v.a, v.b, u);
return dot_online_in(u.a, v) || dot_online_in(u.b, v) || dot_online_in(v.a, u) || dot_online_in(v.b, u);
}

void make()
{
for (int i = 0; i < n; i++)
g[i][i]
= true;
for (int i = 0; i < n - 1; i++)
for (int j = i + 1; j < n; j++)
if (intersect_in(straw[i], straw[j]))
g[i][j]
= g[j][i] = true;
}

void floyd()
{
for (int k = 0; k < n; k++)
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
if (g[i][k] && g[k][j])
g[i][j]
= true;
}

int main()
{
//freopen("t.txt", "r", stdin);
while (scanf("%d", &n), n)
{
memset(g,
0, sizeof(g));
input();
make();
floyd();
int a, b;
while (scanf("%d%d", &a, &b), a | b)
{
a
--;
b
--;
if (g[a][b])
printf(
"CONNECTED\n");
else
printf(
"NOT CONNECTED\n");
}
}
return 0;
}

原文地址:https://www.cnblogs.com/rainydays/p/2181770.html