标签:计算几何
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 3155 | Accepted: 1418 | 
Description
Input
Output
Sample Input
7 1 6 3 3 4 6 4 9 4 5 6 7 1 4 3 5 3 5 5 5 5 2 6 3 5 4 7 2 1 4 1 6 3 3 6 7 2 3 1 3 0 0 2 0 2 0 0 0 0 0 1 1 1 2 2 1 2 0 0 0
Sample Output
CONNECTED NOT CONNECTED CONNECTED CONNECTED NOT CONNECTED CONNECTED CONNECTED CONNECTED CONNECTED
Source
#include <iostream>
#include <cstdio>
using namespace std;
int set[20];
struct Point
{
    int x1,x2,y1,y2;
    Point(int x1 = 0, int x2 = 0, int y1 = 0, int y2 = 0) : x1(x1),x2(x2),y1(y1),y2(y2) {};
    void read()
    {
        scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
    }
}p[20];
void unit(int n)
{
    for(int i = 1; i <= n; i++) set[i] = i;
}
int find(int x)
{
    return x == set[x] ? x : set[x] = find(set[x]);
}
int cross(int x1, int y1, int x2, int y2)
{
    return x1 * y2 - x2 * y1;
}
int intersection(Point A, Point B) //判断直线相交
{
    int c[4];
    if(max(A.x1,A.x2) < min(B.x1,B.x2) || max(A.y1,A.y2) < min(B.y1,B.y2)
       || max(B.x1,B.x2) < min(A.x1,A.x2) || max(B.y1,B.y2) < min(A.y1,A.y2) ) return 0; //考虑共线不相交的情况,为快速排斥定理
    /*判断两条直线是否相交,即只需判断线是否在另一条线的两端*/
    c[0] = cross(A.x2 - A.x1, A.y2 - A.y1, B.x1 - A.x1, B.y1 - A.y1);
    c[1] = cross(A.x2 - A.x1, A.y2 - A.y1, B.x2 - A.x1, B.y2 - A.y1);
    c[2] = cross(B.x2 - B.x1, B.y2 - B.y1, A.x1 - B.x1, A.y1 - B.y1);
    c[3] = cross(B.x2 - B.x1, B.y2 - B.y1, A.x2 - B.x1, A.y2 - B.y1);
    if(c[0] * c[1] <= 0 && c[2] * c[3] <= 0) return 1; //运用到了向量的叉乘和点乘的知识;
    return 0;
}
int main()
{
    //freopen("in.txt","r",stdin);
    int n;
    while(~scanf("%d",&n) && n)
    {
        for(int i = 1; i <= n; i++)
            p[i].read();
        unit(n);
        for(int i = 1; i <= n; i++)
        {
            for(int j = i + 1; j <= n; j++)
            {
                if(intersection(p[i],p[j]))
                {
                    int a = find(i);
                    int b = find(j);
                    if(a != b) set[a] = b;
                }
            }
        }
        int a,b;
        while(~scanf("%d %d",&a,&b), a | b)
        {
            a = find(a);
            b = find(b);
            if(a == b) puts("CONNECTED");
            else puts("NOT CONNECTED");
        }
    }
    return 0;
}
标签:计算几何
原文地址:http://blog.csdn.net/zsgg_acm/article/details/39100789