POJ-1127

来源:互联网 发布:汇贷天下网络贷款 编辑:程序博客网 时间:2024/06/15 21:44

线段相交加并查集。

#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;}
0 0
原创粉丝点击